Ekspor Penyimpanan Objek

Satu objek JSON per sasaran yang terpenuhi, dalam bucket milik Anda. Inilah jalur ke setiap gudang data selain BigQuery.

1. Celah yang Diatasi

Hingga sekarang, hanya ada satu jalur dari MousePlayer ke gudang data, dan jalur itu menuju Google. Jika menggunakan Snowflake, Redshift, atau ClickHouse, tidak ada jalurnya — meskipun ketiganya membaca penyimpanan objek tanpa masalah.

Karena itu, jembatan menulis ke penyimpanan objek, bukan ke setiap gudang data secara terpisah. Snowflake mengambil dari S3, Redshift dari S3, ClickHouse dari S3, dan BigQuery dari Google Cloud Storage. Satu ekspor menjangkau semuanya.

TujuanCara pengalamatan
Amazon S3Signature Version 4, bucket pada host
Cloudflare R2Signature Version 4 ke endpoint akun Anda
Google Cloud Storagemelalui API yang kompatibel dengan S3, dengan kunci HMAC
MinIO, Wasabi, Backblaze B2, dan lainnyaSignature Version 4 ke endpoint Anda
Azure Blob Storagetautan SAS kontainer — tanpa penandatanganan di sisi kami

2. Mengapa Azure Berbeda, dan Mengapa Itu Lebih Baik

Azure Blob tidak menggunakan Signature Version 4; menggunakan SharedKey untuk penandatanganan. Kami bisa membuat skema penandatanganan kedua. Sebagai gantinya, jembatan menerima tautan SAS kontainer — URL yang Anda buat di akun penyimpanan sendiri, dengan tanda tangan sudah di dalamnya.

Itu berarti lebih sedikit kode di sisi kami dan lebih sedikit kepercayaan yang perlu Anda berikan. Kami tidak pernah melihat kunci akun: yang Anda serahkan adalah izin yang cakupannya Anda tentukan sendiri, untuk satu kontainer, dengan tanggal kedaluwarsa pilihan Anda, yang dapat dicabut kapan saja tanpa menyentuh hal lain.

Pembatasan yang sama juga patut diterapkan pada S3: beri kunci akses izin menulis hanya ke satu prefiks ini dan tidak ke tempat lain. Kunci yang hanya dapat menambahkan ke mouseplayer/goals/ tidak dapat membaca bucket lain Anda meskipun bocor.

3. Satu Objek per Sasaran, dan Kuncinya Adalah Tanggal

Penyimpanan objek tidak memiliki operasi append. File harian harus ditulis ulang seluruhnya setiap kali, dan dua sasaran yang tiba bersamaan akan saling menimpa. Karena itu, setiap sasaran yang terpenuhi menjadi objek tersendiri.

Konsekuensinya adalah banyak objek kecil; susunan kuncilah yang membuatnya dapat digunakan:

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

Gudang data membaca satu hari sebagai satu partisi, dan pengisian ulang data merupakan pemindaian prefiks, bukan kueri. Jika ingin mempartisi berdasarkan proyek alih-alih tanggal, masukkan ID kanal ke prefiks.

Setiap Objek Adalah Satu Baris JSON

Sengaja tanpa indentasi, sehingga seluruh prefiks dapat dibaca sebagai NDJSON tanpa membuka objek satu per satu. Cap waktu, proyek, sesi, ID pelanggan, sasaran, nilai, mata uang, dan tautan untuk memutar ulang rekaman.

Nilai Kosong Adalah null, Bukan Nol

Sasaran tanpa nilai uang menulis null. Dalam gudang data, nol akan dijumlahkan ke total yang tidak pernah ada — perbedaan antara “tidak ada jumlah yang disepakati” dan “jumlah nol” tetap terjaga dalam ekspor.

4. Jika Menjawab 403, Baca Ini Dahulu

Permintaan S3 yang ditolak hampir tidak menjelaskan apa pun, dan ada alasan mengapa pesan kesalahan dalam log kami menjelaskan lebih banyak daripada S3: wilayah masuk dalam tanda tangan. Wilayah salah dan kunci salah menghasilkan 403 yang sama, sehingga dugaan paling jelas — kuncinya — hanya benar separuh waktu.

Tiga hal yang perlu diperiksa, dalam urutan ini:

  • Wilayah, persis seperti yang dilaporkan bucket. R2 dan Google Cloud Storage menggunakan auto dan tidak memeriksanya; yang lain memeriksanya.
  • Izin prefiks. Kunci yang dibatasi ke mouseplayer/ tidak dapat menulis ke mouseplayer-goals/ — garis miring penutup berpengaruh pada ARN sumber daya.
  • Endpoint, untuk R2 dan penyimpanan yang kompatibel dengan S3. Tempelkan host tanpa https://; kami menghapusnya bagaimanapun, tetapi jalur yang ditambahkan berarti bucket yang berbeda.

ID kunci akses sengaja disimpan tanpa enkripsi. Sesuai rancangannya, ID dikirim dalam setiap permintaan bertanda tangan, sehingga mengenkripsinya hanya menambah upaya tanpa perlindungan. Rahasianya dienkripsi, tidak pernah ditampilkan lagi, dan tidak pernah masuk ke antrean internal yang membawa tugas.

Semua merek dagang yang disebutkan di sini adalah milik pemiliknya masing-masing. MousePlayer tidak memiliki hubungan bisnis dengan penyedia ini.