Извоз во објектно складиште

Еден JSON-објект по исполнета цел, во кофа што ја поседувате. Ова е патот до секое складиште на податоци што не е BigQuery.

1. Празнината што ја пополнува

Досега имаше точно еден пат од MousePlayer до складиште на податоци и водеше до Google. Ако користите Snowflake, Redshift или ClickHouse, немаше ниту еден - иако сите три без проблем читаат од објектно складиште.

Затоа мостот запишува во објектно складиште наместо во секое складиште на податоци одделно. Snowflake презема од S3, Redshift презема од S3, ClickHouse презема од S3, а BigQuery презема од Google Cloud Storage. Еден извоз стигнува до сите нив.

КадеКако се адресира
Amazon S3Signature Version 4, кофата во домаќинот
Cloudflare R2Signature Version 4 кон крајната точка на вашата сметка
Google Cloud Storageпреку својот API компатибилен со S3, со HMAC-клуч
MinIO, Wasabi, Backblaze B2 и другиSignature Version 4 кон вашата крајна точка
Azure Blob StorageSAS-врска до контејнер - воопшто нема потпишување на нашата страна

2. Зошто Azure е различен и зошто тоа е подобро

Azure Blob не користи Signature Version 4; потпишува со SharedKey. Можевме да изградиме втора шема за потпишување. Наместо тоа мостот прифаќа SAS-врска до контејнер - URL-адреса што ја создавате во вашата сметка за складирање, со веќе вклучен потпис.

Тоа е помалку код на нашата страна и помалку потребна доверба на вашата. Воопшто не гледаме клуч на сметката: ни давате дозвола чиј опсег сами сте го одредиле, за еден контејнер, со рок на истекување што сте го избрале, отповиклива во секое време без да допирате ништо друго.

Истото ограничување вреди да се примени и за S3: дајте му на клучот за пристап дозвола да запишува во само овој префикс и никаде на друго место. Клуч што може само да додава во mouseplayer/goals/ не може да ги чита другите кофи дури и ако протече.

3. Еден објект по цел, а клучот е датум

Објектното складиште нема додавање на крај. Дневна датотека би морала целосно да се препишува секојпат, а две цели што пристигнуваат истовремено би се препишале меѓусебно. Затоа секоја исполнета цел станува посебен објект.

Цената е многу мали објекти; распоредот на клучевите го прави тоа изводливо:

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

Складиште на податоци чита еден ден како една партиција, а дополнување за минат период е скенирање префикс наместо пребарување. Ако сакате поделба по проект наместо по датум, ставете го ID на каналот во префиксот.

Секој објект е еден ред JSON

Намерно без вовлекување, за цел префикс да се чита како NDJSON без отворање на објектите еден по еден. Временски печат, проект, сесија, ID на клиентот, цел, вредност, валута и врска што ја репродуцира снимката.

Празна вредност е null, а не нула

Цел без парична вредност запишува null. Во складиште на податоци нулата би влегла во збир што никогаш не постоел - разликата меѓу „нема договорен износ“ и „износ нула“ се зачувува во извозот.

4. Ако одговара со 403, прво прочитајте го ова

Одбиено S3-барање кажува речиси ништо и има причина зошто пораката за грешка во нашиот дневник кажува повеќе од S3: регионот е дел од потписот. Погрешен регион и погрешен клуч создаваат исто 403, па очигледниот осомничен - клучот - е точниот само во половина од случаите.

Три нешта за проверка, по овој ред:

  • Регионот, точно како што го пријавува кофата. R2 и Google Cloud Storage прифаќаат auto и не го проверуваат; сите други го проверуваат.
  • Дозволата за префиксот. Клуч со опсег mouseplayer/ не може да запишува во mouseplayer-goals/ - косата црта на крајот е важна во ARN на ресурсот.
  • Крајната точка, за R2 и складишта компатибилни со S3. Залепете го домаќинот без https://; го отстрануваме во секој случај, но патека додадена на него е друга кофа.

ID на клучот за пристап намерно се чува нешифриран. По замисла се испраќа во секое потпишано барање, па неговото шифрирање би било труд без заштита. Тајната е шифрирана, никогаш повторно не се прикажува и никогаш не влегува во внатрешната редица што ја носи задачата.

Сите трговски марки наведени тука им припаѓаат на нивните соодветни сопственици. MousePlayer нема деловен однос со овие даватели.