Export în stocare de obiecte
Un obiect JSON pe obiectiv îndeplinit, într-un bucket propriu. Calea către orice depozit de date care nu este BigQuery.
1. Golul pe care îl acoperă
Până acum exista o singură cale de la MousePlayer la un depozit de date, către Google. Pentru Snowflake, Redshift sau ClickHouse nu exista, deși toate citesc fără probleme din stocarea de obiecte.
Puntea scrie deci în stocare de obiecte, nu în fiecare depozit separat. Snowflake, Redshift și ClickHouse importă din S3, BigQuery din Google Cloud Storage. Un export ajunge la toate.
| Destinație | Adresare |
|---|---|
| Amazon S3 | Signature Version 4, bucketul în gazdă |
| Cloudflare R2 | Signature Version 4 către endpointul contului |
| Google Cloud Storage | prin API compatibil S3, cu cheie HMAC |
| MinIO, Wasabi, Backblaze B2 și altele | Signature Version 4 către endpointul propriu |
| Azure Blob Storage | link SAS de container — fără semnare la noi |
2. De ce Azure diferă și de ce este mai bine
Azure Blob nu folosește Signature Version 4, ci SharedKey. Am fi putut construi o a doua schemă de semnare. În schimb, puntea primește un link SAS de container — URL generat în propriul cont de stocare, cu semnătura deja inclusă.
Mai puțin cod la noi și mai puțină încredere cerută de la dumneavoastră. Nu vedem cheia contului: furnizați o permisiune limitată de dumneavoastră la un container, cu expirare aleasă și revocabilă oricând fără alte modificări.
Aceeași limitare este utilă în S3: permiteți cheii să scrie doar în acest prefix și nicăieri altundeva. O cheie care poate doar adăuga în mouseplayer/goals/ nu poate citi celelalte bucketuri nici dacă este divulgată.
3. Un obiect pe obiectiv, cu data în cheie
Stocarea de obiecte nu are adăugare la final. Fișierul zilnic ar trebui rescris complet, iar două obiective simultane s-ar suprascrie. Fiecare obiectiv devine propriul obiect.
Rezultă multe obiecte mici; structura cheii le face utilizabile:
prefix/YYYY/MM/DD/channel/session-goal.json
Depozitul citește o zi ca partiție, iar completarea istoricului scanează prefixul, nu execută interogare. Pentru partiționare pe proiect, nu pe dată, puneți ID-ul canalului în prefix.
Fiecare obiect este o linie JSON
Intenționat fără indentare, astfel încât întregul prefix să fie citit ca NDJSON fără deschiderea individuală. Marcaj temporal, proiect, sesiune, ID client, obiectiv, valoare, monedă și link de redare.
Valoarea goală este null, nu zero
Un obiectiv fără valoare monetară scrie null. Zero ar intra într-un total inexistent — diferența dintre „sumă neconvenită” și „sumă de zero” rămâne în export.
4. Dacă răspunde 403, citiți întâi asta
Respingerea S3 spune foarte puțin; jurnalul nostru explică mai mult fiindcă regiunea intră în semnătură. Regiunea greșită și cheia greșită dau același 403, deci suspiciunea evidentă — cheia — este corectă doar în jumătate din cazuri.
Verificați în această ordine:
- Regiunea, exact cum o raportează bucketul. R2 și Google Cloud Storage acceptă
autoși nu o verifică; ceilalți o verifică. - Permisiunea prefixului. Cheia limitată la
mouseplayer/nu poate scrie înmouseplayer-goals/— bara oblică finală contează în ARN-ul resursei. - Endpointul, pentru R2 și stocări compatibile S3. Lipiți gazda fără
https://; eliminăm oricum prefixul, dar o cale adăugată înseamnă alt bucket.
ID-ul cheii de acces este păstrat intenționat în clar. Este transmis în fiecare cerere semnată, deci criptarea nu ar proteja nimic. Secretul este criptat, nu se reafișează și nu intră în coada internă a sarcinii.
Toate mărcile menționate aici aparțin proprietarilor lor. MousePlayer nu are relații comerciale cu acești furnizori.