تصدير تخزين الكائنات

كائن JSON لكل هدف مكتمل في حاوية تملكها. المسار لكل مستودع بيانات غير BigQuery.

1. الفجوة التي يسدها

حتى الآن وُجد مسار واحد من MousePlayer لمستودع بيانات، يقود إلى Google. لا مسار لـ Snowflake أو Redshift أو ClickHouse — رغم قراءة الثلاثة من تخزين الكائنات بسهولة.

لذا يكتب الجسر إلى تخزين الكائنات بدل كل مستودع منفردًا. يستقبل Snowflake وRedshift و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 للحاوية — URL تولّده في حساب التخزين ويحمل التوقيع بالفعل.

كود أقل لدينا وثقة مطلوبة أقل منك. لا نرى مفتاح حساب مطلقًا: تمنح إذنًا حددت نطاقه لحاوية واحدة ومدة اختَرتها، قابلًا للإلغاء متى شئت دون المساس بالبقية.

يُستحسن التقييد نفسه مع S3: امنح المفتاح الكتابة في هذه البادئة وحدها ولا غيرها. مفتاح لا يضيف إلا إلى mouseplayer/goals/ لا يمكنه قراءة حاوياتك الأخرى ولو تسرّب.

3. كائن لكل هدف والمفتاح تاريخ

لا إضافة لاحقة في تخزين الكائنات. يحتاج الملف اليومي إعادة كتابة كاملة كل مرة، وهدفان متزامنان سيكتب أحدهما فوق الآخر. لذا يصبح كل هدف كائنًا مستقلًا.

الثمن كائنات صغيرة كثيرة؛ ويجعل ترتيب المفاتيح ذلك عمليًا:

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

يقرأ المستودع يومًا كقسم واحد، والإكمال الرجعي مسح بادئة لا استعلام. إن أردت التقسيم بالمشروع بدل التاريخ، ضع معرّف القناة في البادئة.

كل كائن سطر JSON واحد

دون تنسيق متعمدًا، فتُقرأ البادئة كلها كـ NDJSON دون فتح الكائنات منفردة. الطابع الزمني والمشروع والجلسة ومعرّف العميل والهدف والقيمة والعملة ورابط التشغيل.

القيمة الفارغة null لا صفر

الهدف دون قيمة نقدية يكتب null. الصفر في المستودع يدخل مجموعًا لم يوجد — ويبقى فرق «لا مبلغ متفق عليه» و«مبلغ صفر» بعد التصدير.

4. إذا أعاد 403 فاقرأ هذا أولًا

لا يخبرك طلب S3 المرفوض بالكثير، ولسجلنا رسالة أوضح لسبب: تدخل المنطقة في التوقيع. تعطي المنطقة والمفتاح الخاطئان 403 نفسه، فلا يكون الاشتباه البديهي بالمفتاح صحيحًا إلا نصف المرات.

تحقق من ثلاثة أشياء بهذا الترتيب:

  • المنطقة، كما تُبلغها الحاوية بدقة. يقبل R2 وGoogle Cloud Storage القيمة auto ولا يفحصانها؛ والبقية تفعل.
  • إذن البادئة. مفتاح مقتصر على mouseplayer/ لا يكتب في mouseplayer-goals/ — الشرطة المائلة الأخيرة مهمة في ARN المورد.
  • نقطة النهاية، لـ R2 والمخازن المتوافقة مع S3. الصق المضيف دون https://؛ نزيله على أي حال، لكن المسار الملحق حاوية مختلفة.

يُحفظ معرّف مفتاح الوصول واضحًا عمدًا. ينتقل في كل طلب موقّع بطبيعته، فتشفيره جهد دون حماية. السر مشفّر ولا يُعرض ثانية ولا يدخل قائمة المهام الداخلية.

كل العلامات التجارية المذكورة ملك لأصحابها. لا تربط MousePlayer علاقة تجارية بهؤلاء المزودين.