Uitvoer na objekberging
Een JSON-objek per bereikte doelwit in 'n bergingsemmer wat u besit. Dit is die roete na elke datapakhuis buiten BigQuery.
1. Die gaping wat dit vul
Tot nou was daar presies een roete van MousePlayer na 'n datapakhuis en dit het na Google gelei. Vir Snowflake, Redshift of ClickHouse was daar geen nie — hoewel al drie sonder probleem uit objekberging lees.
Die brug skryf dus na objekberging eerder as na elke pakhuis afsonderlik. Snowflake lees uit S3, Redshift lees uit S3, ClickHouse lees uit S3 en BigQuery lees uit Google Cloud Storage. Een uitvoer bereik almal.
| Waar | Hoe dit aangespreek word |
|---|---|
| Amazon S3 | Signature Version 4, bergingsemmer in die gasheer |
| Cloudflare R2 | Signature Version 4 teen u rekeningeindpunt |
| Google Cloud Storage | deur sy S3-versoenbare API met 'n HMAC-sleutel |
| MinIO, Wasabi, Backblaze B2 en ander | Signature Version 4 teen u eindpunt |
| Azure Blob Storage | 'n houer-SAS-skakel — geen ondertekening aan ons kant nie |
2. Waarom Azure anders is en waarom dit beter is
Azure Blob gebruik nie Signature Version 4 nie; dit teken met SharedKey. Ons kon 'n tweede ondertekeningskema bou. Die brug neem eerder 'n houer-SAS-skakel — 'n URL wat u in u eie bergingsrekening genereer, met die handtekening reeds daarin.
Dit is minder kode aan ons kant en minder vertroue aan u kant. Ons sien nooit 'n rekeningsleutel nie: u gee 'n toestemming waarvan u self die omvang bepaal het, vir een houer, met u gekose vervaldatum, enige tyd herroepbaar sonder om enigiets anders te raak.
Dieselfde terughoudendheid help aan die S3-kant: gee die toegangsleutel toestemming om net na hierdie een voorvoegsel te skryf. 'n Sleutel wat net kan byvoeg by mouseplayer/goals/ kan nie u ander bergingsemmers lees nie, selfs al lek dit uit.
3. Een objek per doelwit; die sleutel is 'n datum
Objekberging kan nie byvoeg nie. 'n Daaglikse lêer sou elke keer volledig herskryf moet word en twee gelyktydige doelwitte sou mekaar oorskryf. Elke bereikte doelwit word dus 'n eie objek.
Die prys is baie klein objekte; die sleutelindeling maak dit werkbaar:
prefix/YYYY/MM/DD/channel/session-goal.json
'n Datapakhuis lees een dag as een partisie en terugvulling is 'n voorvoegselskandering eerder as 'n navraag. As u volgens projek eerder as datum wil verdeel, plaas die kanaal-ID in die voorvoegsel.
Elke objek is een reël JSON
Doelbewus sonder inkeping, sodat 'n hele voorvoegsel as NDJSON lees sonder om elke objek apart oop te maak. Tydstempel, projek, sessie, klant-ID, doelwit, waarde, geldeenheid en die skakel wat die opname herspeel.
'n Leë waarde is null, nie nul nie
'n Doelwit sonder geldwaarde skryf null. In 'n datapakhuis sou nul by 'n totaal optel wat nooit bestaan het nie — die onderskeid tussen “geen bedrag ooreengekom nie” en “'n bedrag van nul” bly in die uitvoer behoue.
4. As dit 403 antwoord, lees eers dit
'n Geweierde S3-versoek sê byna niks; daar is 'n rede waarom die fout in ons logboek meer sê as S3: die streek word in die handtekening gebruik. 'n Verkeerde streek en verkeerde sleutel lewer dieselfde 403, dus is die voor-die-hand-liggende verdagte — die sleutel — net die helfte van die tyd reg.
Drie dinge om in hierdie volgorde na te gaan:
- Die streek, presies soos die bergingsemmer dit rapporteer. R2 en Google Cloud Storage gebruik
autoen kontroleer dit nie; almal anders wel. - Die voorvoegseltoestemming. 'n Sleutel met omvang
mouseplayer/kan nie skryf namouseplayer-goals/nie — die laaste skuinsstreep maak saak in 'n hulpbron-ARN. - Die eindpunt, vir R2 en S3-versoenbare berging. Plak die gasheer sonder
https://; ons verwyder dit in elk geval, maar 'n pad daarby is 'n ander bergingsemmer.
Die toegangsleutel-ID word doelbewus ongeënkripteer gestoor. Dit word met elke getekende versoek gestuur, dus sou enkripsie werk sonder beskerming wees. Die geheim is geënkripteer, word nooit weer gewys nie en gaan nooit in die interne taakry nie.
Alle handelsmerke wat hier genoem word, behoort aan hul onderskeie eienaars. MousePlayer het geen sakeverhouding met hierdie verskaffers nie.