Izvoz u skladište objekata
Jedan JSON objekat po ostvarenom cilju u bucket-u čiji ste vlasnik. Ovo je put do svakog skladišta podataka osim BigQuery-ja.
1. Praznina koju ovo popunjava
Do sada je postojao tačno jedan put iz MousePlayer-a u skladište podataka i vodio je ka Google-u. Ako koristite Snowflake, Redshift ili ClickHouse, nije ga bilo — iako sva tri bez problema čitaju iz skladišta objekata.
Zato most piše u skladište objekata umesto redom u svako skladište podataka. Snowflake uvozi iz S3, Redshift uvozi iz S3, ClickHouse uvozi iz S3, a BigQuery uvozi iz Google Cloud Storage-a. Jedan izvoz stiže do svih.
| Gde | Kako se adresira |
|---|---|
| Amazon S3 | Signature Version 4, bucket u hostu |
| Cloudflare R2 | Signature Version 4 prema endpoint-u vašeg naloga |
| Google Cloud Storage | preko API-ja kompatibilnog sa S3, pomoću HMAC ključa |
| MinIO, Wasabi, Backblaze B2 i drugi | Signature Version 4 prema vašem endpoint-u |
| Azure Blob Storage | SAS link kontejnera — bez ikakvog potpisivanja na našoj strani |
2. Zašto je Azure drugačiji i zašto je to bolje
Azure Blob ne koristi Signature Version 4; potpisuje preko SharedKey-a. Mogli smo da napravimo drugu šemu potpisivanja. Umesto toga, most prihvata SAS link kontejnera — URL koji generišete u svom nalogu skladišta, sa već ugrađenim potpisom.
To znači manje koda kod nas i manje potrebnog poverenja kod vas. Nikada ne vidimo ključ naloga: predajete dozvolu čiji ste opseg sami odredili, za jedan kontejner, sa datumom isteka koji ste izabrali, opozivu u svakom trenutku bez promene bilo čega drugog.
Isto ograničavanje vredi primeniti na S3 strani: dajte pristupnom ključu dozvolu da piše samo u ovaj jedan prefiks i nigde drugde. Ključ koji može samo da dodaje u mouseplayer/goals/ ne može da čita druge bucket-e čak ni ako procuri.
3. Jedan objekat po cilju, a ključ je datum
Skladište objekata nema dodavanje na kraj. Dnevna datoteka morala bi svaki put cela da se prepiše, a dva istovremena cilja prepisala bi jedan drugi. Zato svaki ostvareni cilj postaje zaseban objekat.
Cena je mnogo malih objekata; raspored ključa čini to upotrebljivim:
prefix/YYYY/MM/DD/channel/session-goal.json
Skladište podataka čita jedan dan kao jednu particiju, a naknadna dopuna je pretraga prefiksa umesto upita. Ako želite particionisanje po projektu umesto po datumu, stavite ID kanala u prefiks.
Svaki objekat je jedan JSON red
Namerno bez uvlačenja, pa ceo prefiks može da se čita kao NDJSON bez otvaranja objekata pojedinačno. Vremenska oznaka, projekat, sesija, ID kupca, cilj, vrednost, valuta i link koji reprodukuje snimak.
Prazna vrednost je null, ne nula
Cilj bez novčane vrednosti upisuje null. U skladištu podataka nula bi se sabrala u zbir koji nikada nije postojao — razlika između „iznos nije dogovoren“ i „iznos je nula“ ostaje sačuvana pri izvozu.
4. Ako odgovara sa 403, prvo pročitajte ovo
Odbijeni S3 zahtev gotovo ništa ne govori i postoji razlog zašto poruka greške u našoj evidenciji kaže više nego S3: region ulazi u potpis. Pogrešan region i pogrešan ključ proizvode isti 403, pa je očigledna sumnja — ključ — tačna samo u polovini slučajeva.
Tri stvari koje treba proveriti ovim redom:
- Region, tačno kako ga bucket navodi. R2 i Google Cloud Storage prihvataju
autoi ne proveravaju ga; svi ostali proveravaju. - Dozvolu prefiksa. Ključ sa opsegom
mouseplayer/ne može da piše umouseplayer-goals/— završna kosa crta je važna u ARN-u resursa. - Endpoint za R2 i skladišta kompatibilna sa S3. Nalepite host bez
https://; uklanjamo ga u oba slučaja, ali dodata putanja znači drugi bucket.
ID pristupnog ključa namerno se čuva nešifrovano. Po dizajnu putuje u svakom potpisanom zahtevu, pa bi njegovo šifrovanje bio trud bez zaštite. Tajna je šifrovana, nikada se ponovo ne prikazuje i nikada ne ulazi u interni red čekanja koji prenosi zadatak.
Svi ovde navedeni žigovi pripadaju svojim vlasnicima. MousePlayer nema poslovni odnos sa ovim pružaocima usluga.