تصدير تخزين الكائنات
كائن JSON لكل هدف مكتمل في حاوية تملكها. المسار لكل مستودع بيانات غير BigQuery.
1. الفجوة التي يسدها
حتى الآن وُجد مسار واحد من MousePlayer لمستودع بيانات، يقود إلى Google. لا مسار لـ Snowflake أو Redshift أو ClickHouse — رغم قراءة الثلاثة من تخزين الكائنات بسهولة.
لذا يكتب الجسر إلى تخزين الكائنات بدل كل مستودع منفردًا. يستقبل Snowflake وRedshift وClickHouse من S3، وBigQuery من Google Cloud Storage. تصدير واحد للجميع.
| الوجهة | طريقة المخاطبة |
|---|---|
| Amazon S3 | Signature Version 4، الحاوية في المضيف |
| Cloudflare R2 | Signature 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 علاقة تجارية بهؤلاء المزودين.