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.

GdjeKako se pristupa
Amazon S3Signature Version 4, bucket u hostu
Cloudflare R2Signature Version 4 prema endpointu 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šem endpointu
Azure Blob StorageSAS 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 auto i ne provjeravaju je; svi ostali provjeravaju.
  • Dozvola prefiksa. Ključ ograničen na mouseplayer/ ne može pisati u mouseplayer-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.