Izvoz u objektnu pohranu
Jedan JSON objekt po ostvarenom cilju, u bucketu koji posjedujete. Ovo je put do svakog skladišta podataka koje nije BigQuery.
1. Praznina koju popunjava
Dosad je postojao tač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 piše u objektnu pohranu, ne u svako skladište pojedinačno. Snowflake učitava iz S3, Redshift iz S3, ClickHouse iz S3, a BigQuery iz Google Cloud Storagea. Jedan izvoz stiže do svih.
| Gdje | Kako se pristupa |
|---|---|
| Amazon S3 | Signature Version 4, bucket u hostu |
| Cloudflare R2 | Signature Version 4 prema endpointu 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šem endpointu |
| Azure Blob Storage | SAS link kontejnera — bez našeg potpisivanja |
2. Zašto je Azure drugačiji i zašto je to bolje
Azure Blob ne koristi Signature Version 4, nego potpisuje sa SharedKey. Mogli smo izgraditi drugu shemu potpisivanja. Umjesto toga most prihvata SAS link kontejnera kao URL koji generirate u vlastitom računu pohrane, s već ugrađenim potpisom.
To je manje koda kod nas i manje potrebnog povjerenja kod vas. Nikad ne vidimo ključ računa: dajete dozvolu koju ste sami ograničili na jedan kontejner, s datumom isteka po izboru i opozivom bilo kada bez drugih promjena.
Istu suzdržanost vrijedi primijeniti na S3: dajte pristupnom ključu dozvolu pisanja u samo ovaj prefiks i nigdje drugo. Ključ koji može samo dodavati u mouseplayer/goals/ ne može čitati druge buckete č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 potpuno prepisati, a dva istovremena cilja prepisala bi jedan drugi. Zato svaki ostvareni cilj postaje zaseban objekt.
Cijena je mnogo malih objekata; raspored ključa čini to praktičnim:
prefix/YYYY/MM/DD/channel/session-goal.json
Skladište čita jedan dan kao jednu particiju, a dopunjavanje je pretraga prefiksa umjesto upita. Ako želite particije po projektu umjesto datumu, stavite ID kanala u prefiks.
Svaki objekt je jedan red JSON-a
Namjerno bez uvlačenja da se cijeli prefiks čita kao NDJSON bez pojedinačnog otvaranja objekata. Vremenska oznaka, projekt, sesija, ID klijenta, cilj, vrijednost, valuta i link reprodukcije snimka.
Prazna vrijednost je null, ne nula
Cilj bez novčane vrijednosti upisuje null. U skladištu bi se nula sabrala u zbir koji nikad nije postojao — razlika između „iznos nije dogovoren“ i „iznos je nula“ preživljava izvoz.
4. Ako odgovara 403, prvo pročitajte ovo
Odbijeni S3 zahtjev gotovo ništa ne kaže, a postoji razlog zašto poruka greške u našem zapisu govori više nego S3: regija ulazi u potpis. Pogrešna regija i pogrešan ključ daju isti 403, pa je očigledna sumnja — ključ — tačna samo polovinu vremena.
Tri stvari za provjeru ovim redom:
- Regija, tačno kako je bucket prijavljuje. R2 i Google Cloud Storage prihvataju
autoi ne provjeravaju je; svi ostali provjeravaju. - Dozvola prefiksa. Ključ ograničen na
mouseplayer/ne može pisati umouseplayer-goals/jer završna kosa crta ima značaj u ARN-u resursa. - Endpoint, za R2 i pohrane kompatibilne sa S3. Zalijepite host bez
https://; uklanjamo ga u svakom slučaju, ali dodana putanja znači drugi bucket.
ID pristupnog ključa namjerno se čuva nešifriran. Putuje u svakom potpisanom zahtjevu po dizajnu, pa bi šifriranje bilo trud bez zaštite. Tajna se šifrira, ne prikazuje ponovo i nikad ne ulazi u interni red zadataka.
Svi ovdje navedeni zaštitni znakovi pripadaju njihovim vlasnicima. MousePlayer nema poslovni odnos s ovim pružaocima usluga.