Eksport në ruajtje objektesh

Një objekt JSON për çdo objektiv të përmbushur, në një bucket që zotëroni. Kjo është rruga drejt çdo depoje të dhënash që nuk është BigQuery.

1. Boshllëku që plotëson kjo

Deri tani kishte saktësisht një rrugë nga MousePlayer drejt një depoje të dhënash dhe ajo çonte te Google. Nëse përdorni Snowflake, Redshift ose ClickHouse, nuk kishte asnjë - megjithëse të tria lexojnë nga ruajtja e objekteve pa problem.

Prandaj ura shkruan në ruajtje objektesh dhe jo te çdo depo me radhë. Snowflake merr nga S3, Redshift merr nga S3, ClickHouse merr nga S3 dhe BigQuery merr nga Google Cloud Storage. Një eksport i arrin të gjitha.

KuSi adresohet
Amazon S3Signature Version 4, bucket në host
Cloudflare R2Signature Version 4 kundrejt pikës fundore të llogarisë suaj
Google Cloud Storagepërmes API-së së pajtueshme me S3, me çelës HMAC
MinIO, Wasabi, Backblaze B2 dhe të tjerëSignature Version 4 kundrejt pikës suaj fundore
Azure Blob Storagelidhje SAS e kontejnerit - pa asnjë nënshkrim në anën tonë

2. Pse Azure është ndryshe dhe pse kjo është më mirë

Azure Blob nuk komunikon me Signature Version 4; nënshkruan me SharedKey. Mund të kishim ndërtuar një skemë të dytë nënshkrimi. Në vend të saj ura merr një lidhje SAS kontejneri - një URL që gjeneroni në llogarinë tuaj të ruajtjes, me nënshkrimin tashmë brenda saj.

Kjo do të thotë më pak kod në anën tonë dhe më pak besim të kërkuar nga ju. Nuk shohim fare çelës llogarie: ajo që dorëzoni është leje që e keni kufizuar vetë, në një kontejner, me datë skadimi të zgjedhur prej jush, e revokueshme kurdoherë pa prekur asgjë tjetër.

I njëjti kufizim ia vlen të zbatohet në anën S3: jepini çelësit të hyrjes leje të shkruajë vetëm në këtë prefiks dhe askund tjetër. Një çelës që mund të shtojë vetëm në mouseplayer/goals/ nuk mund t'i lexojë bucket-et tuaja të tjera edhe nëse zbulohet.

3. Një objekt për objektiv dhe çelësi është datë

Ruajtja e objekteve nuk ka shtim në fund. Një skedar ditor do të duhej të rishkruhej i gjithi çdo herë dhe dy objektiva që mbërrijnë njëkohësisht do të mbishkruanin njëri-tjetrin. Prandaj çdo objektiv i përmbushur bëhet objekt më vete.

Çmimi është shumë objekte të vogla; struktura e çelësit e bën këtë të realizueshme:

prefix/YYYY/MM/DD/channel/session-goal.json

Një depo lexon një ditë si një ndarje dhe plotësimi prapaveprues është skanim prefiksi në vend të kërkesës. Nëse dëshironi ndarje sipas projektit në vend të datës, vendosni ID-në e kanalit në prefiks.

Çdo objekt është një rresht JSON

Qëllimisht pa dhëmbëzim, që i gjithë prefiksi të lexohet si NDJSON pa hapur objektet një nga një. Koha, projekti, seanca, ID-ja e klientit, objektivi, vlera, monedha dhe lidhja që riprodhon regjistrimin.

Vlera e zbrazët është null, jo zero

Një objektiv pa vlerë monetare shkruan null si vlerë. Në një depo, zero do të shtohej në një total që nuk ekzistoi kurrë - dallimi ndërmjet „pa shumë të rënë dakord“ dhe „shumë zero“ mbijeton eksportin.

4. Nëse përgjigjet 403, lexojeni këtë së pari

Një kërkesë S3 e refuzuar thotë pothuajse asgjë dhe ka arsye pse mesazhi i gabimit në regjistrin tonë thotë më shumë se S3: rajoni përfshihet në nënshkrim. Një rajon i gabuar dhe një çelës i gabuar prodhojnë të njëjtën 403, ndaj dyshimi i dukshëm - çelësi - është i saktë vetëm gjysmën e kohës.

Tri gjëra për të kontrolluar, në këtë rend:

  • Rajoni, pikërisht siç e raporton bucket-i. R2 dhe Google Cloud Storage marrin auto dhe nuk e kontrollojnë; të gjithë të tjerët po.
  • Leja e prefiksit. Një çelës i kufizuar në mouseplayer/ nuk mund të shkruajë në mouseplayer-goals/ - pjerrtësja në fund ka rëndësi në një ARN burimi.
  • Pika fundore, për R2 dhe ruajtjet e pajtueshme me S3. Ngjitni hostin pa https://; e heqim gjithsesi, por një rrugë e shtuar në të është bucket tjetër.

ID-ja e çelësit të hyrjes ruhet qëllimisht e pakoduar. Përcillet në çdo kërkesë të nënshkruar nga projektimi, ndaj enkriptimi i saj do të ishte përpjekje pa mbrojtje. Sekreti enkriptohet, nuk shfaqet më dhe nuk hyn kurrë në radhën e brendshme që mbart detyrën.

Të gjitha markat tregtare të përmendura këtu u përkasin pronarëve përkatës. MousePlayer nuk ka marrëdhënie tregtare me këta ofrues.