تخزين كائنات متوافق مع S3 للمطورين الأفارقة: بلا صدمات فواتير الإخراج
نُشر: · مُحدث: · 1 دقائق قراءة · بواسطة Oluniyi D. Ajao
هل تقيّم بدائل لخدمة Amazon S3؟ واجهة S3 API هي المعيار الفعلي لتخزين الكائنات: تقريباً كل أداة للمطورين تأتي بتكامل متوافق مع S3، وتشغيل boto3 أو s3cmd ذاكرة عضلية للغالبية. لكن بالنسبة للأعباء التي يشغّلها المطورون الأفارقة عادة، نموذج التسعير لدى المزود المهيمن يصعب التعايش معه.
مكتبة وسائط WordPress لموقع يخدم قراء نيجيريين. نسخة Postgres احتياطية تُستعاد إلى آلة staging في جوهانسبرغ. خدمة فيديو عند الطلب لجمهور في كينيا. في الحالات الثلاث، التكلفة المهيمنة هي الإخراج (egress): النطاق الخارج من الـ bucket إلى المستهلك أو هدف الاستعادة: وتسعير الإخراج لدى المزودين الرئيسيين عقابي فعلاً. الأسعار النموذجية تتراوح بين 0,08 و 0,12 $/غيغابايت في التيرابايتات الأولى، وتنخفض عند حجم بيتابايت، وتكون أعلى من عمليات النشر في المناطق الأفريقية. صفحة منتج تجارة إلكترونية شائعة مع بعض الصور قد تسرّب مئات الدولارات شهرياً في الإخراج دون أن يلاحظ أحد حتى تصل الفاتورة.
هذه هي الفجوة التي يمكن لبديل متوافق مع S3 أن يسدّها: الواجهة نفسها التي يعرفها المطورون، مع نموذج تسعير لا يستنزفك في تكاليف النطاق الترددي.
ما الذي يحتاج البديل الحقيقي المتوافق مع S3 أن يقدمه
ثلاث متطلبات تقنية وواحدة تجارية:
- توافق مع S3 API. ليس «لدينا object store بواجهة مختلفة»: بل توافق فعلي مع S3 API. النقطة أن كل SDK، وكل pipeline CI/CD، وكل أداة نسخ احتياطي تتحدث هذه الواجهة بشكل أصلي. إذا اضطررت إلى إعادة كتابة كود لاعتماد واجهة مختلفة، فتكلفة التبديل تلتهم التوفير.
- متانة من نفس رتبة الحجم. الخدمة الرائدة تذكر 99,999999999% (أحد عشر تسعة) من المتانة عبر النسخ متعدد المناطق (multi-AZ). البديل لا يحتاج إلى مضاهاة ذلك بالضبط: تسعة أتساع تكفي لمعظم الأعباء: لكن يجب أن يكون في نفس المحادثة. NAS على آلة واحدة مع RAID-6 لا يؤهّل.
- اتساق القراءة-بعد-الكتابة. الشاغل الأساسي يقدم اتساقاً قوياً لقراءة-بعد-كتابة منذ 2020. البدائل التي لا تزال على الاتساق النهائي (eventual consistency) ستعضّك في أي سير عمل يُقرأ فيه كائن حُمِّل للتو: وهي الغالبية.
- تسعير نطاق يمكن التنبؤ به. هذه هي الفكرة كلها. إذا كان البديل يقيس النطاق بمعدلات hyperscaler، فلا سبب للتبديل. النطاق المضمّن بسعر ثابت، أو نموذج طبقات واضح، هو ما يجعل الحسابات تنجح للأعباء ذات الجمهور الأفريقي.
تخزين الكائنات من AFRICLOUD كبديل
خدمة تخزين الكائنات من AFRICLOUD متاحة الآن في لشبونة (المنطقة eu-lis-1). تُنشئ الحاويات (buckets) من لوحة تحكم AFRICLOUD، وتحصل كل حاوية على مفتاح وصول ومفتاح سري خاصّين بها. نقطة الاتصال s3.africloud.com تعمل بواجهة S3 API، لذا تتصل بها أدواتك المعتادة دون أي تعديل: aws-cli مع تحديد نقطة الاتصال، وs3cmd، وrclone.
صُمّم التسعير لمعالجة مشكلة تكاليف الإخراج (egress) الموضّحة أعلاه. يكلّف التخزين 0,02 دولار أمريكي لكل غيغابايت شهرياً، ويُحتسب يومياً على الحجم المخزَّن فعلاً. حركة الإخراج مشمولة حتى ثلاثة أضعاف الحجم المخزَّن كل شهر، وما يتجاوز ذلك يُحتسب بسعر 0,02 دولار أمريكي لكل غيغابايت. ويمكن لكل حساب أن يضم حتى 10 حاويات و500 غيغابايت إجمالاً.
أين تبقى الخدمة الرائدة متفوقة
ثلاث حالات مشروعة للبقاء مع الخدمة القائمة:
- تكامل عميق مع المنظومة. إذا كان pipeline لديك يعتمد على أحداث object-store تطلق دوال serverless أو مهام تدريب ML في نفس منظومة المزود، فإن ترحيل تخزين الكائنات وحده يخلق egress عبر السحابة يلتهم التوفير.
- توصيل edge عالمي. CDN متكامل بإحكام مع object store يمنحك حضور edge عبر القارات بنقرة واحدة. إذا كان جمهورك موزعاً عالمياً وتحتاج إلى edge في كل منطقة، فإن بديلاً بعدد نقاط أقل سيكون أبطأ فعلاً.
- تسعير الأرشفة الباردة. للبيانات الباردة فعلاً التي يُوصل إليها أقل من مرة في السنة، مستويات deep-archive حول 0,001 $/غيغابايت/شهر يصعب التغلب عليها. البديل لتخزين الكائنات دون طبقة باردة يكلّف أكثر لهذه الحالة تحديداً.
مسار الترحيل
لمعظم buckets الجمهور الأفريقي، الترحيل هو أمر rclone sync واحد وتحديث إعدادات على مستوى التطبيق. ثلاث خطوات:
- اضبط rclone بكلا نقطتَي النهاية المتوافقتَين مع S3، المصدر والهدف. ملف
~/.config/rclone/rclone.confقياسي مع remote-ين. - زامن الـ bucket.
rclone sync source:your-bucket target:destination-bucket --progress. رسوم egress من المصدر حقيقية (فاتورة أخيرة عند الخروج)، لذا لـ buckets كبيرة، ضعها في الميزانية. - حدّث تطبيقك. غيّر عنوان endpoint في إعداداتك ليشير إلى المزود الجديد. لمعظم SDKs هذا متغيّر بيئة واحد أو سطر كود واحد (
boto3.client("s3", endpoint_url=...)).
اختبر أولاً مع bucket صغير للقراءة فقط، تحقق من تطابق أنماط الوصول، ثم رحّل الإنتاج. إذا كنت تستخدم URLs موقّعة مسبقاً (pre-signed URLs) للتنزيلات، تأكد أنها تعمل مع الـ endpoint الجديد: يجب أن تعمل، لأنها نفس الواجهة، لكن يستحق التحقق من تدوير الاعتمادات قبل التبديل.
راجع صفحة Object Storage للاطلاع على الأسعار والحدود الحالية، أو تواصل معنا لمناقشة تفاصيل ترحيل عبء العمل الخاص بك.