Արտահանում օբյեկտային պահոց

Մեկ JSON օբյեկտ յուրաքանչյուր կատարված նպատակի համար՝ ձեր սեփական bucket-ում։ Սա ճանապարհն է դեպի BigQuery-ից բացի բոլոր տվյալների պահեստները։

1. Ինչ բաց է լրացնում

Մինչ այժմ MousePlayer-ից տվյալների պահեստ հասնելու ճիշտ մեկ ճանապարհ կար, և այն տանում էր Google։ Եթե օգտագործում եք Snowflake, Redshift կամ ClickHouse, ճանապարհ չկար, թեև երեքն էլ առանց խնդրի կարդում են օբյեկտային պահոցից։

Ուստի կամուրջը գրում է օբյեկտային պահոց՝ յուրաքանչյուր պահեստի հերթով գրելու փոխարեն։ Snowflake-ը ներմուծում է S3-ից, Redshift-ը՝ S3-ից, ClickHouse-ը՝ S3-ից, իսկ BigQuery-ն՝ Google Cloud Storage-ից։ Մեկ արտահանումը հասնում է բոլորին։

ՈրտեղԻնչպես է հասցեագրվում
Amazon S3Signature Version 4՝ bucket-ը հոսթի մեջ
Cloudflare R2Signature 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/ -ին ավելացնել կարողացող բանալին նույնիսկ արտահոսելիս չի կարող կարդալ մյուս bucket-ները։

3. Մեկ օբյեկտ՝ յուրաքանչյուր նպատակի համար, բանալին՝ ամսաթիվ

Օբյեկտային պահոցում ավելացման գործողություն չկա։ Օրական ֆայլն ամեն անգամ պետք է ամբողջությամբ վերագրվեր, և միաժամանակ հասնող երկու նպատակներ կվերագրեին միմյանց։ Ուստի յուրաքանչյուր կատարված նպատակն առանձին օբյեկտ է դառնում։

Գինը բազմաթիվ փոքր օբյեկտներն են. բանալիների կառուցվածքն է դա գործնական դարձնում՝

prefix/YYYY/MM/DD/channel/session-goal.json

Պահեստը մեկ օրը կարդում է որպես մեկ բաժին, իսկ հետադարձ լրացումը նախածանցի սկանավորում է, ոչ հարցում։ Եթե ուզում եք բաժանել ըստ նախագծի՝ ամսաթվի փոխարեն, նախածանցում դրեք ալիքի ID-ն։

Յուրաքանչյուր օբյեկտը JSON-ի մեկ տող է

Միտումնավոր առանց նահանջների, որպեսզի ամբողջ նախածանցը կարդացվի որպես NDJSON՝ առանց օբյեկտները հերթով բացելու։ Ժամանակադրոշմ, նախագիծ, աշխատաշրջան, հաճախորդի ID, նպատակ, արժեք, արժույթ և ձայնագրությունը բացող հղում։

Դատարկ արժեքը null է, ոչ զրո

Դրամական արժեք չունեցող նպատակը գրում է null։ Պահեստում զրոն կմիանար երբեք չեղած ընդհանուր գումարին. «գումար համաձայնեցված չէ» և «զրո գումար» տարբերությունը պահպանվում է արտահանման մեջ։

4. Եթե պատասխանը 403 է, նախ սա կարդացեք

Մերժված S3 հարցումը գրեթե ոչինչ չի ասում, և կա պատճառ, թե ինչու մեր մատյանի հաղորդագրությունն ավելին է ասում, քան S3-ը՝ տարածաշրջանը ներառվում է ստորագրության մեջ։ Սխալ տարածաշրջանն ու սխալ բանալին տալիս են նույն 403-ը, ուստի ակնհայտ կասկածը՝ բանալին, ճիշտ է դեպքերի միայն կեսում։

Ստուգեք երեք բան՝ այս հերթականությամբ՝

  • Տարածաշրջանը՝ ճիշտ ինչպես bucket-ն է հայտնում։ R2-ն ու Google Cloud Storage-ը վերցնում են auto և չեն ստուգում. մյուսները ստուգում են։
  • Նախածանցի թույլտվությունը։ mouseplayer/ -ով սահմանափակված բանալին չի կարող գրել mouseplayer-goals/ -ում. վերջի շեղ գիծը կարևոր է ռեսուրսի ARN-ում։
  • Վերջնակետը՝ R2-ի և S3-ի հետ համատեղելի պահոցների համար։ Հոսթը տեղադրեք առանց https://. ամեն դեպքում դա հեռացնում ենք, բայց կցված ուղին արդեն ուրիշ bucket է։

Հասանելիության բանալու ID-ն միտումնավոր պահվում է բաց տեսքով։ Այն նախագծով փոխանցվում է յուրաքանչյուր ստորագրված հարցման հետ, ուստի գաղտնագրելը ջանք կլիներ՝ առանց պաշտպանության։ Գաղտնիքը գաղտնագրված է, այլևս չի ցուցադրվում և երբեք չի մտնում առաջադրանքը կրող ներքին հերթը։

Այստեղ նշված բոլոր ապրանքային նշանները պատկանում են իրենց տերերին։ MousePlayer-ը գործարար կապ չունի այս մատակարարների հետ։