ობიექტურ საცავში ექსპორტი
თითო შესრულებულ მიზანზე ერთი JSON ობიექტი თქვენს ბაკეტში. ეს გზაა ყველა მონაცემთა საწყობისკენ, რომელიც BigQuery არ არის.
1. რას ავსებს
აქამდე MousePlayer-იდან საწყობში ზუსტად ერთი გზა იყო და Google-ში მიდიოდა. Snowflake-ისთვის, Redshift-ისთვის ან ClickHouse-ისთვის გზა არ იყო, მიუხედავად იმისა, რომ სამივე ობიექტური საცავიდან უპრობლემოდ კითხულობს.
ამიტომ ხიდი თითო საწყობის ნაცვლად ობიექტურ საცავში წერს. Snowflake S3-დან იღებს, Redshift S3-დან იღებს, ClickHouse S3-დან იღებს, BigQuery კი Google Cloud Storage-იდან. ერთი ექსპორტი ყველას სწვდება.
| სად | როგორ მიმართავს |
|---|---|
| Amazon S3 | Signature Version 4, ბაკეტი ჰოსტში |
| Cloudflare R2 | Signature Version 4 თქვენი ანგარიშის ენდპოინტზე |
| Google Cloud Storage | S3-თავსებადი API-ით, HMAC გასაღებით |
| MinIO, Wasabi, Backblaze B2 და სხვები | Signature Version 4 თქვენს ენდპოინტზე |
| Azure Blob Storage | კონტეინერის SAS ბმული — ჩვენს მხარეს ხელმოწერის გარეშე |
2. რატომ განსხვავდება Azure და რატომაა ეს უკეთესი
Azure Blob Signature Version 4-ს არ იყენებს; ხელს SharedKey-ით აწერს. შეგვეძლო მეორე სქემის აგება, მაგრამ ხიდი იღებს კონტეინერის SAS ბმულს — URL-ს, რომელსაც საკუთარ საცავის ანგარიშში ქმნით უკვე არსებული ხელმოწერით.
ჩვენს მხარეს ნაკლები კოდია და თქვენს მხარეს ნაკლები ნდობაა საჭირო. ანგარიშის გასაღებს ვერასდროს ვხედავთ: გვაძლევთ თქვენ მიერ ერთ კონტეინერზე შეზღუდულ ნებართვას, არჩეული ვადით და სხვაზე შეხების გარეშე ნებისმიერ დროს გასაუქმებელს.
იგივე სიფრთხილე S3-ზეც ღირს: გასაღებს ჩაწერის უფლება მიანიჭეთ მხოლოდ ამ ერთ პრეფიქსში და სხვაგან არა. გასაღები, რომელსაც დამატება მხოლოდ აქ შეუძლია: mouseplayer/goals/ გაჟონვის შემთხვევაშიც ვერ წაიკითხავს სხვა ბაკეტებს.
3. თითო მიზანზე ერთი ობიექტი, გასაღებად თარიღი
ობიექტურ საცავს დამატება არ აქვს. დღიური ფაილი ყოველ ჯერზე სრულად გადაიწერებოდა და ერთდროულად მოსული ორი მიზანი ერთმანეთს გადაფარავდა. ამიტომ ყოველი შესრულებული მიზანი ცალკე ობიექტია.
სანაცვლოდ ბევრი პატარა ობიექტი იქმნება; გასაღების განლაგება ამას პრაქტიკულს ხდის:
prefix/YYYY/MM/DD/channel/session-goal.json
საწყობი ერთ დღეს ერთ დანაყოფად კითხულობს; ძველი მონაცემების შევსება მოთხოვნის ნაცვლად პრეფიქსის სკანირებაა. თუ თარიღის ნაცვლად პროექტით დაყოფა გსურთ, პრეფიქსში channel ID ჩასვით.
თითო ობიექტი JSON-ის ერთი ხაზია
განზრახ ჩაღრმავების გარეშე, რათა მთელი პრეფიქსი NDJSON-ად იკითხებოდეს ობიექტების ცალ-ცალკე გახსნის გარეშე. დრო, პროექტი, სესია, კლიენტის ID, მიზანი, ღირებულება, ვალუტა და დაკვრის ბმული.
ცარიელი მნიშვნელობა null-ია და არა ნული
ფულადი ღირებულების არმქონე მიზანი წერს null. საწყობში ნული არარსებულ ჯამში შეიკრიბებოდა — ექსპორტი ინარჩუნებს განსხვავებას „თანხა არ შეთანხმებულა“ და „თანხა ნულია“ შორის.
4. თუ 403-ს პასუხობს, ჯერ ეს წაიკითხეთ
უარყოფილი S3 მოთხოვნა თითქმის არაფერს ამბობს; არსებობს მიზეზი, რატომ ამბობს ჩვენი ჟურნალის შეცდომა მეტს, ვიდრე S3: რეგიონი ხელმოწერაში შედის. არასწორი რეგიონი და გასაღები ერთსა და იმავე 403-ს იწვევს, ამიტომ გასაღვზე აშკარა ეჭვი მხოლოდ ნახევარ შემთხვევაშია სწორი.
სამი რამ შეამოწმეთ, ამ რიგით:
- რეგიონიზუსტად როგორც ბაკეტი ამბობს. R2 და Google Cloud Storage იღებს
autoმნიშვნელობას და არ ამოწმებს; დანარჩენები ამოწმებს. - პრეფიქსის ნებართვა. გასაღები, რომელსაც უფლება მხოლოდ აქ აქვს:
mouseplayer/ვერ ჩაწერს აქ:mouseplayer-goals/— resource ARN-ში ბოლო დახრილ ხაზს მნიშვნელობა აქვს. - ენდპოინტიR2-სა და S3-თავსებადი საცავებისთვის. ჩასვით ჰოსტი პრეფიქსის გარეშე:
https://; ისედაც ვაშორებთ, მაგრამ დამატებული გზა სხვა ბაკეტია.
წვდომის გასაღების ID განზრახ ღია ტექსტად ინახება. ის ყველა ხელმოწერილ მოთხოვნაში მოძრაობს, ამიტომ დაშიფვრა დაცვას არ დაამატებდა. საიდუმლო დაშიფრულია, აღარ ჩანს და დავალების შიდა რიგში არასდროს ხვდება.
აქ დასახელებული ყველა სავაჭრო ნიშანი შესაბამის მფლობელს ეკუთვნის. MousePlayer-ს ამ პროვაიდერებთან საქმიანი კავშირი არ აქვს.