Obyekt saqlashga eksport
Har bajarilgan maqsadga bitta JSON obyekt, o‘zingizga tegishli bucket’da. Bu BigQuery’dan boshqa barcha omborlarga yo‘l.
1. Qaysi bo‘shliqni to‘ldiradi
Hozirgacha MousePlayer’dan ma’lumotlar omboriga aynan bitta yo‘l bor edi — Google’ga. Snowflake, Redshift yoki ClickHouse ishlatsangiz, yo‘l yo‘q edi, holbuki uchalasi ham obyekt saqlashdan muammosiz o‘qiydi.
Shuning uchun ko‘prik har omborga navbatma-navbat emas, obyekt saqlashga yozadi. Snowflake S3’dan, Redshift S3’dan, ClickHouse S3’dan, BigQuery esa Google Cloud Storage’dan oladi. Bitta eksport barchasiga yetadi.
| Qayerga | Qanday manzillanadi |
|---|---|
| Amazon S3 | Signature Version 4, bucket xost ichida |
| Cloudflare R2 | Hisob endpoint’ingizga Signature Version 4 |
| Google Cloud Storage | S3-mos API’si orqali, HMAC kaliti bilan |
| MinIO, Wasabi, Backblaze B2 va boshqalar | Endpoint’ingizga Signature Version 4 |
| Azure Blob Storage | konteyner SAS havolasi — biz tomonda umuman imzolash yo‘q |
2. Nega Azure boshqacha va nega bu yaxshiroq
Azure Blob Signature Version 4 emas, SharedKey bilan imzolaydi. Ikkinchi imzolash sxemasini qura olardik. O‘rniga ko‘prik shuni oladi: konteyner SAS havolasi — o‘z saqlash hisobingizda yaratgan, imzosi allaqachon ichida bo‘lgan URL.
Bizda kamroq kod, sizda kamroq ishonch talabi. Hisob kalitini umuman ko‘rmaymiz: beradigani o‘zingiz chegaralagan, bitta konteyner uchun, o‘zingiz tanlagan muddatli va boshqasiga tegmasdan istalgan payt bekor qilinadigan ruxsat.
Shu cheklovni S3 tomonida ham qo‘llang: kirish kalitiga faqat shu bitta prefiksga yozish huquqini bering. Faqat shunga qo‘sha oladigan kalit: mouseplayer/goals/ sizib chiqsa ham boshqa bucket’laringizni o‘qiy olmaydi.
3. Har maqsadga bitta obyekt, kalit esa sana
Obyekt saqlashda qo‘shib yozish yo‘q. Kunlik fayl har safar butunlay qayta yozilardi, bir vaqtda kelgan ikki maqsad bir-birini bosardi. Shu sababli har bajarilgan maqsad alohida obyekt.
Evaziga ko‘p kichik obyekt bo‘ladi; kalit tuzilmasi buni qulay qiladi:
prefix/YYYY/MM/DD/channel/session-goal.json
Ombor bir kunni bitta bo‘lim sifatida o‘qiydi, orqaga to‘ldirish so‘rov emas, prefiks skanidir. Sana o‘rniga loyiha bo‘yicha bo‘lmoqchi bo‘lsangiz, kanal ID’sini prefiksga qo‘ying.
Har obyekt bitta JSON qatori
Ataylab chekinishsiz, butun prefiks obyektlarni bittadan ochmasdan NDJSON bo‘lib o‘qiladi. Vaqt, loyiha, sessiya, mijoz ID’si, maqsad, qiymat, valyuta va yozuvni ijro qiladigan havola.
Bo‘sh qiymat nol emas, null
Pul qiymatisiz maqsad shuni yozadi: null. Omborda nol hech mavjud bo‘lmagan jamga qo‘shilardi — “summa kelishilmagan” va “nol summa” farqi eksportda saqlanadi.
4. 403 javobida avval shuni o‘qing
Rad etilgan S3 so‘rovi deyarli hech narsa aytmaydi, jurnalimiz S3’dan ko‘proq aytishining sababi bor: hudud imzoga kiradi. Noto‘g‘ri hudud va kalit bir xil 403 beradi, yaqqol gumon — kalit — faqat yarmida to‘g‘ri.
Shu tartibda uch narsani tekshiring:
- Hudud — bucket aytganining aynan o‘zi. R2 va Google Cloud Storage shuni oladi:
autova tekshirmaydi; boshqalar tekshiradi. - Prefiks ruxsati. Faqat shunga cheklangan kalit:
mouseplayer/shunga yozolmaydi:mouseplayer-goals/— resurs ARN’ida oxirgi qiya chiziq muhim. - Endpoint — R2 va S3-mos saqlashlar uchun. Xostni shu prefikssiz qo‘ying:
https://; har holda olib tashlaymiz, ammo unga yo‘l qo‘shilsa, boshqa bucket bo‘ladi.
Kirish kaliti ID’si ataylab ochiq saqlanadi. Dizayn bo‘yicha har imzolangan so‘rovda yuradi, uni shifrlash himoyasiz mehnat bo‘lardi. Maxfiy kalit shifrlangan, qayta ko‘rsatilmaydi va vazifa tashuvchi ichki navbatga hech kirmaydi.
Bu yerda atalgan barcha savdo belgilari o‘z egalariga tegishli. MousePlayer bu provayderlar bilan tijorat aloqasiga ega emas.