Nesne depolamaya dışa aktarım
Gerçekleşen her hedef için, size ait bir kovada bir JSON nesnesi. BigQuery dışındaki tüm veri ambarlarına giden yol budur.
1. Doldurduğu boşluk
Şimdiye kadar MousePlayer'dan veri ambarına giden tam bir yol vardı ve o da Google'a çıkıyordu. Snowflake, Redshift veya ClickHouse kullanıyorsanız hiçbir yol yoktu; oysa üçü de nesne depolamadan sorunsuzca veri okuyabilir.
Bu yüzden köprü her veri ambarına ayrı ayrı yazmak yerine nesne depolamaya yazar. Snowflake S3'ten, Redshift S3'ten, ClickHouse S3'ten, BigQuery ise Google Cloud Storage'dan veri alır. Tek bir dışa aktarım hepsine ulaşır.
| Hedef | Adresleme biçimi |
|---|---|
| Amazon S3 | Signature Version 4; kova, sunucu adında yer alır |
| Cloudflare R2 | hesap uç noktanıza Signature Version 4 |
| Google Cloud Storage | S3 uyumlu API'si üzerinden, HMAC anahtarıyla |
| MinIO, Wasabi, Backblaze B2 ve diğerleri | uç noktanıza Signature Version 4 |
| Azure Blob Storage | kapsayıcı SAS bağlantısı; bizim tarafımızda imzalama yapılmaz |
2. Azure neden farklıdır ve bu neden daha iyidir?
Azure Blob, Signature Version 4 kullanmaz; SharedKey ile imzalar. İkinci bir imzalama düzeni oluşturabilirdik. Bunun yerine köprü şu bilgiyi alır: kapsayıcı SAS bağlantısı . Bu, kendi depolama hesabınızda oluşturduğunuz ve imzayı zaten içeren bir URL'dir.
Böylece bizim tarafımızda daha az kod, sizin tarafınızda daha az güven gereksinimi olur. Hesap anahtarını hiç görmeyiz: bize verdiğiniz şey, kapsamını kendiniz belirlediğiniz, seçtiğiniz bitiş tarihine sahip, tek bir kapsayıcı için geçerli ve başka hiçbir şeye dokunmadan istediğiniz an iptal edebileceğiniz bir izindir.
Aynı sınırlamayı S3 tarafında da uygulamaya değer: erişim anahtarına yalnızca bu tek öneke yazma izni verin. Yalnızca şu öneke ekleme yapabilen bir anahtar: mouseplayer/goals/ , sızsa bile diğer kovalarınızı okuyamaz.
3. Hedef başına bir nesne; anahtar bir tarihtir
Nesne depolamada sonuna ekleme işlemi yoktur. Günlük bir dosyanın her seferinde tamamen yeniden yazılması gerekirdi; aynı anda gelen iki hedef de birbirinin üzerine yazardı. Bu yüzden gerçekleşen her hedef ayrı bir nesne olur.
Bunun bedeli çok sayıda küçük nesnedir; anahtar düzeni bunu kullanılabilir kılar:
prefix/YYYY/MM/DD/channel/session-goal.json
Veri ambarı bir günü tek bir bölüm olarak okur; geçmişe dönük doldurma ise bir sorgu yerine önek taramasıdır. Tarih yerine projeye göre bölümlemek istiyorsanız kanal kimliğini öneke ekleyin.
Her nesne tek satırlık JSON'dur
Özellikle girintisiz yazılır; böylece nesneleri tek tek açmadan tüm önek NDJSON olarak okunabilir. Zaman damgası, proje, oturum, müşteri kimliği, hedef, değer, para birimi ve kaydı yeniden oynatan bağlantı bulunur.
Boş değer sıfır değil, null olur
Parasal değeri olmayan bir hedef şu değeri yazar: null. Veri ambarında sıfır, hiç var olmamış bir toplama dahil olurdu. “Tutar kararlaştırılmadı” ile “tutar sıfır” arasındaki fark dışa aktarımda korunur.
4. 403 yanıtı alırsanız önce bunu okuyun
Reddedilen bir S3 isteği neredeyse hiçbir şey söylemez. Günlüğümüzdeki hata mesajının S3'ten daha fazla bilgi vermesinin bir nedeni vardır: bölge, imzaya dahil edilir. Yanlış bölge ile yanlış anahtar aynı 403 yanıtını üretir; bu yüzden ilk şüpheli olan anahtar, yalnızca durumların yarısında asıl nedendir.
Şu sırayla üç şeyi kontrol edin:
- Bölge; tam olarak kovanın bildirdiği biçimde. R2 ve Google Cloud Storage şu değeri alır:
autove kontrol etmez; diğerlerinin tümü kontrol eder. - Önek izni. Şu kapsamla sınırlandırılmış bir anahtar:
mouseplayer/, şu konuma yazamaz:mouseplayer-goals/. Kaynak ARN'sinde sondaki eğik çizgi önemlidir. - Uç nokta; R2 ve S3 uyumlu depolar için. Sunucu adını şu önek olmadan yapıştırın:
https://. Biz her durumda öneki kaldırırız; ancak sonuna bir yol eklenmişse farklı bir kovayı gösterir.
Erişim anahtarı kimliği özellikle açık olarak saklanır. Tasarım gereği imzalanmış her istekte gönderildiğinden onu şifrelemek koruma sağlamayan bir çaba olurdu. Gizli anahtar şifrelenir, bir daha gösterilmez ve görevi taşıyan dahili kuyruğa asla girmez.
Burada adı geçen tüm ticari markalar ilgili sahiplerine aittir. MousePlayer'ın bu sağlayıcılarla ticari ilişkisi yoktur.