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.
| Gdje | Kako se adresira |
|---|---|
| Amazon S3 | Signature Version 4, spremnik u nazivu poslužitelja |
| Cloudflare R2 | Signature Version 4 prema krajnjoj točki vašeg računa |
| Google Cloud Storage | putem API-ja kompatibilnog sa S3, uz HMAC ključ |
| MinIO, Wasabi, Backblaze B2 i drugi | Signature Version 4 prema vašoj krajnjoj točki |
| Azure Blob Storage | SAS 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
autoi ne provjeravaju je; svi ostali provjeravaju. - Dopuštenje za prefiks. Ključ s opsegom
mouseplayer/ne može pisati umouseplayer-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.