صدور به ذخیره‌سازی شیء

یک شیء 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 Storageپیوند SAS کانتینر؛ بدون امضا در سمت ما

2. چرا Azure متفاوت است و چرا بهتر است

Azure Blob از Signature Version 4 استفاده نمی‌کند؛ با SharedKey امضا می‌کند. می‌توانستیم روش امضای دوم بسازیم. به‌جای آن پل این را می‌گیرد: پیوند SAS کانتینر - نشانی ساخته‌شده در حساب ذخیره‌سازی خودتان که امضا از قبل در آن است.

یعنی کد کمتر در سمت ما و نیاز به اعتماد کمتر در سمت شما. اصلاً کلید حساب را نمی‌بینیم: مجوزی می‌دهید که خودتان به یک کانتینر محدود کرده‌اید، با تاریخ انقضای انتخابی و قابل پس گرفتن در هر زمان بدون دست زدن به چیز دیگر.

همین محدودسازی در S3 هم می‌ارزد: به کلید فقط مجوز نوشتن در همین یک پیشوند و نه چیز دیگر بدهید. کلیدی که فقط می‌تواند به این مورد اضافه کند: mouseplayer/goals/ حتی با نشت هم باکت دیگر را نمی‌خواند.

3. یک شیء برای هر هدف و کلید یک تاریخ است

ذخیره‌سازی شیء افزودن به انتها ندارد. فایل روزانه باید هر بار کامل بازنویسی شود و دو هدف هم‌زمان روی هم می‌نویسند. پس هر هدف محقق‌شده شیء خودش را دارد.

هزینه‌اش شیء کوچک فراوان است؛ چیدمان کلید آن را عملی می‌کند:

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

انبار یک روز را یک پارتیشن می‌خواند و تکمیل گذشته اسکن پیشوند است، نه پرس‌وجو. برای پارتیشن بر پایهٔ پروژه به‌جای تاریخ، شناسهٔ کانال را در پیشوند بگذارید.

هر شیء یک خط JSON است

عمداً بدون تورفتگی تا کل پیشوند بدون باز کردن تک‌تک اشیا به‌صورت NDJSON خوانده شود. زمان، پروژه، نشست، شناسهٔ مشتری، هدف، ارزش، واحد پول و پیوند بازپخش ضبط.

مقدار خالی null است، نه صفر

هدف بدون ارزش پولی این را می‌نویسد: null. در انبار صفر به جمعی افزوده می‌شود که هرگز وجود نداشته؛ تفاوت «مبلغی توافق نشده» و «مبلغ صفر» در خروجی باقی می‌ماند.

4. اگر 403 داد، اول این را بخوانید

درخواست ردشدهٔ S3 تقریباً چیزی نمی‌گوید و دلیلی هست که پیام گزارش ما بیشتر از S3 می‌گوید: منطقه وارد امضا می‌شود. منطقهٔ غلط و کلید غلط هر دو 403 می‌دهند؛ پس مظنون بدیهی، کلید، فقط نیمی از وقت درست است.

سه مورد را به این ترتیب بررسی کنید:

  • منطقه، دقیقاً طبق گزارش باکت. R2 و Google Cloud Storage این را می‌گیرند: auto و بررسی نمی‌کنند؛ بقیه بررسی می‌کنند.
  • مجوز پیشوند. کلید محدود به mouseplayer/ نمی‌تواند در این مورد بنویسد: mouseplayer-goals/ - خط مورب پایانی در ARN منبع مهم است.
  • نقطهٔ پایانی، برای R2 و مخزن سازگار با S3. میزبان را بدون این مورد بچسبانید: https://؛ در هر حال آن را حذف می‌کنیم، اما مسیر افزوده‌شده به آن باکت دیگری است.

شناسهٔ کلید دسترسی عمداً روشن ذخیره می‌شود. بنا به طراحی در هر درخواست امضاشده می‌رود و رمزگذاری آن زحمت بدون حفاظت است. رمز اصلی رمزگذاری می‌شود، هرگز دوباره نشان داده نمی‌شود و هرگز در صف داخلی حامل کار نمی‌رود.

همهٔ علائم تجاری نام‌برده متعلق به مالکانشان‌اند. MousePlayer با این ارائه‌دهندگان رابطهٔ تجاری ندارد.