Izvoz u objektnu pohranu

Jedan JSON objekt po ostvarenom cilju, u spremniku u vašem vlasništvu. To je put u svako skladište podataka koje nije BigQuery.

1. Koju prazninu popunjava

Dosad je postojao točno jedan put iz MousePlayera u skladište podataka i vodio je Googleu. Za Snowflake, Redshift ili ClickHouse nije ga bilo – iako sva tri bez problema čitaju iz objektne pohrane.

Zato most zapisuje u objektnu pohranu umjesto redom u svako skladište. Snowflake učitava iz S3, Redshift iz S3, ClickHouse iz S3, a BigQuery iz Google Cloud Storagea. Jedan izvoz dopire do svih.

GdjeKako se adresira
Amazon S3Signature Version 4, spremnik u nazivu poslužitelja
Cloudflare R2Signature Version 4 prema krajnjoj točki vašeg računa
Google Cloud Storageputem API-ja kompatibilnog sa S3, uz HMAC ključ
MinIO, Wasabi, Backblaze B2 i drugiSignature Version 4 prema vašoj krajnjoj točki
Azure Blob StorageSAS poveznica spremnika – bez potpisivanja na našoj strani

2. Zašto je Azure drukčiji i zašto je to bolje

Azure Blob ne koristi Signature Version 4; potpisuje uz SharedKey. Mogli smo izraditi drugi sustav potpisivanja. Umjesto toga most prihvaća SAS poveznicu spremnika – URL koji generirate u vlastitom računu pohrane, s već uključenim potpisom.

To znači manje koda kod nas i manje potrebnog povjerenja kod vas. Nikad ni ne vidimo ključ računa: dajete dopuštenje čiji ste opseg sami odredili, za jedan spremnik, s odabranim datumom isteka i mogućnošću opoziva u svakom trenutku bez diranja ostaloga.

Istu suzdržanost vrijedi primijeniti i za S3: pristupnom ključu dopustite zapisivanje u samo ovaj prefiks i ništa drugo. Ključ koji može samo dodavati u mouseplayer/goals/ ne može čitati ostale spremnike čak ni ako procuri.

3. Jedan objekt po cilju, a ključ je datum

Objektna pohrana nema dodavanje na kraj. Dnevnu datoteku trebalo bi svaki put cijelu prepisati, a dva istodobna cilja prepisala bi jedan drugoga. Zato svaki ostvareni cilj postaje zaseban objekt.

Cijena je mnogo malih objekata; raspored ključeva čini to izvedivim:

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

Skladište čita jedan dan kao jednu particiju, a naknadna dopuna skeniranje je prefiksa umjesto upita. Želite li particioniranje po projektu umjesto po datumu, stavite ID kanala u prefiks.

Svaki objekt je jedan redak JSON-a

Namjerno bez uvlačenja kako bi se cijeli prefiks čitao kao NDJSON bez pojedinačnog otvaranja objekata. Vremenska oznaka, projekt, sesija, ID kupca, cilj, vrijednost, valuta i poveznica za reprodukciju snimke.

Prazna vrijednost je null, a ne nula

Cilj bez novčane vrijednosti zapisuje null. U skladištu bi se nula zbrojila u ukupni iznos koji nikad nije postojao – razlika između „iznos nije određen“ i „iznos je nula“ ostaje sačuvana pri izvozu.

4. Ako vraća 403, prvo pročitajte ovo

Odbijeni S3 zahtjev gotovo ništa ne govori, a postoji razlog zašto poruka u našem dnevniku govori više od S3: regija je dio potpisa. Pogrešna regija i pogrešan ključ daju isti 403 pa je očita sumnja – ključ – opravdana samo u polovici slučajeva.

Tri provjere ovim redom:

  • Regija, točno kako je spremnik navodi. R2 i Google Cloud Storage prihvaćaju auto i ne provjeravaju je; svi ostali provjeravaju.
  • Dopuštenje za prefiks. Ključ s opsegom mouseplayer/ ne može pisati u mouseplayer-goals/ – završna kosa crta važna je u ARN-u resursa.
  • Krajnja točka, za R2 i pohrane kompatibilne sa S3. Zalijepite naziv poslužitelja bez https://; uklanjamo ga u svakom slučaju, ali putanja dodana nazivu predstavlja drugi spremnik.

ID pristupnog ključa namjerno se pohranjuje nešifriran. Po dizajnu putuje u svakom potpisanom zahtjevu pa bi šifriranje značilo trud bez zaštite. Tajna je šifrirana, više se ne prikazuje i nikad ne ulazi u interni red sa zadatkom.

Svi ovdje navedeni žigovi pripadaju svojim vlasnicima. MousePlayer nema poslovni odnos s tim pružateljima.