Loading...
حالة استخدام

حالة استخدام: تخزين الوسائط وتوصيلها عبر CDN

انقل الصور والفيديو والملفات القابلة للتنزيل والنسخ الاحتياطية من خادم تطبيقك إلى Object Storage متوافق مع S3، ثم قدّم كل أصل من التخزين المؤقت على حافة cdn.com.tr. يتوقف الأصل (origin) عن معالجة حركة البايت الثقيلة، ويصبح كل من فاتورة تخزينك ووزن صفحاتك تحت السيطرة.

حالة استخدام: تخزين الوسائط وتوصيلها عبر CDN

المشكلة: حركة الوسائط تسحق الأصل

عندما تكون صور المنتجات والفيديوهات الرئيسية وملفات PDF ورفعات المستخدمين على الخادم نفسه الذي يعرض صفحاتك، ينافس كل طلب صورة عمل التطبيق الحقيقي على المعالج ووحدات الإدخال/الإخراج للقرص وعرض النطاق. صفحة واحدة رائجة بها ثلاثون صورة تضاعف الحركة ثلاثين ضعفاً على أصل واحد، وقد يؤدي ارتفاع مفاجئ في الحركة أو تنزيل فيديو كبير إلى حرمان التطبيق من الموارد التي يحتاجها للاستجابة أصلاً. كما أن التخزين على خادم التطبيق صعب التوسع: ينفد القرص في النهاية، وتصبح النسخ الاحتياطية لنظام ملفات ضخم بطيئة وهشة. فصل البايت عن المنطق هو أول إصلاح بنيوي، وهو ما يقدمه هذا السيناريو.

كيف تحلها cdn.com.tr: buckets مع تخزين مؤقت على الحافة

تخزّن كل أصل في bucket من Object Storage متوافق مع S3، ما يمنحك سعة مرنة فعلياً ونقطة نهاية تتحدث معها تطبيقاتك بأدوات S3 القياسية. أمام ذلك الـ bucket تضع CDN الخاصة بـ cdn.com.tr، فيحدث التوصيل الفعلي إلى المتصفحات من مواقع الحافة، لا من الـ bucket، وأبداً من خادم تطبيقك. يملأ أول طلب لملف ما التخزين المؤقت على الحافة؛ ويُقدَّم كل طلب لاحق لذلك الملف من الحافة دون لمس Object Storage مجدداً. والنتيجة أن أصلك لا يعالج تقريباً أياً من حركة البايت، وتتوسع طبقة تخزينك باستقلال عن الحوسبة، ويحصل المستخدمون على الأصول من عقدة حافة قريبة بدلاً من خادم بعيد واحد.

مفاتيح access والأصول العامة والملفات الخاصة

يُتحكَّم في كل bucket عبر أزواج access key و secret تنشئها وتدوّرها وتبطلها من اللوحة. للوسائط العامة مثل صور الكتالوج، تُوصِّل عبر نطاق الـ CDN وتُبقي نقطة نهاية الـ bucket الخام خارج شيفرة صفحاتك. وللمواد الخاصة مثل التنزيلات المدفوعة أو النسخ الاحتياطية الداخلية، تُبقي الكائنات غير عامة وتصدر روابط signed قصيرة العمر مولَّدة بمفتاح الـ access، بحيث ينتهي صلاحية الرابط بدلاً من أن يبقى للأبد. ولأن كل تكامل يحصل على مفتاحه الخاص، فإن أداة رفع مخترقة أو متعاقداً مغادراً يعني إبطالاً بنقرة واحدة بدلاً من إعادة تعيين كلمة مرور على مستوى المنصة كاملة.

Cache-control و purge دون أن تسمم تخزينك المؤقت بنفسك

التخزين المؤقت جيد بقدر الترويسات التي تضبطها على كائناتك. امنح الأصول طويلة العمر والمُصدَرة قيمة Cache-Control بعيدة المدى مع immutable، وامنح الأشياء التي تتغير فعلاً كثيراً قيمة TTL أقصر. أنظف نمط هو أسماء ملفات مبنية على تجزئة المحتوى: عندما تتغير صورة يتغير عنوانها، فتقدم الحافة الملف الجديد طبيعياً ولا تصارع تخزيناً مؤقتاً قديماً أبداً. وعندما يجب أن تكتب فوق ملف عند العنوان نفسه — تبديل شعار، أو ملف PDF مصحَّح — يُسقط purge موجَّه من اللوحة أو cdnctl ذلك الكائن من كل موقع حافة كي يعيد الطلب التالي سحبه من الـ bucket. هذا يبقي عمليات الإبطال نادرة ودقيقة وآمنة.

التوسع من بضع صور إلى مكتبة وسائط كاملة

الإعداد نفسه الذي يقدم حفنة من الشعارات يتوسع إلى كتالوج من مئات آلاف صور المنتجات، أو مكتبة فيديو عند الطلب، أو أرشيف متجدد من النسخ الاحتياطية الليلية، لأن Object Storage ينمو دون أن توفر أقراصاً وتمتص الحافة حركة القراءة. المواقع الغنية بالوسائط ترى أوضح المكاسب: تصبح الصفحات أخف وأسرع مع تدفق الصور من حواف قريبة، وينخفض عرض نطاق الأصل — وهو غالباً أغلى وأهش مورد — انخفاضاً حاداً. وتحصل النسخ الاحتياطية على بيت نظيف أيضاً، معزولة في bucket خاص بها ومفتاح access خاص بها، بعيداً عن مسار التوصيل العام.

أين يتناسب مع بقية المنصة

هذا السيناريو مركّز عن قصد على التخزين والتوصيل، لكنه يتكامل مع كل شيء آخر على الحساب. يمكن لتطبيق WordPress أو PHP أن ينقل مجلد الرفعات لديه إلى bucket ويستمر في تقديم الموقع عبر الحافة نفسها. ويمكن لتطبيق حاوية أن يربط الـ bucket كمتغيرات بيئة ويقرأ أو يكتب الكائنات مباشرة. يتولى DNS و Auto SSL نطاق التوصيل، ويمنحك purge والسجلات والحالة الرؤية التشغيلية لتأكيد أن الأصول تتدفق من التخزين المؤقت ولا تنفذ صامتة إلى الأصل عند كل طلب.

كيفية الإعداد، خطوة بخطوة

1

أنشئ bucket

في اللوحة، افتح Object Storage وأنشئ bucket لوسائطك (مثلاً media-prod). تحصل على نقطة نهاية متوافقة مع S3، ومنطقة، واسم bucket. احتفظ بـ buckets منفصلة للأصول العامة والنسخ الاحتياطية الخاصة كي لا تتداخل سياسات وصولها أبداً.

2

أنشئ مفتاح access ذا نطاق محدد

أنشئ زوج access key / secret للـ bucket وألصقه في أداة الرفع أو CMS أو S3 SDK لديك. استخدم مفتاحاً واحداً لكل تطبيق كي تتمكن من تدوير أو إبطال تكامل واحد دون كسر البقية. يمكن تدوير المفاتيح من اللوحة في أي وقت إذا تسرّب أحدها.

3

ارفع بترويسات صحيحة

ادفع الأصول باستخدام عميل S3 الحالي لديك أو aws-cli أو الإضافة، واضبط Content-Type وقيمة Cache-Control طويلة (مثلاً max-age=31536000, immutable) على الملفات التي لا تتغير أبداً. استخدم أسماء ملفات مبنية على تجزئة المحتوى مثل logo.a1b2c3.png كي يكون كل إصدار جديد عنواناً جديداً ولا يحتاج أبداً إلى إبطال.

4

ضع الـ CDN في المقدمة

اربط نطاق توصيل (مثلاً cdn.example.com) بالـ CDN ووجّه أصله (origin) إلى نقطة نهاية الـ bucket. تصل الطلبات الآن إلى الحافة أولاً، وتُخزَّن مؤقتاً عبر المواقع، ولا تنفذ إلى Object Storage إلا عند أول طلب لكل أصل. يُصدر Auto SSL الشهادة لنطاق التوصيل تلقائياً.

5

تحقق من سلوك التخزين المؤقت

حمّل أصلاً مرتين وتحقق من ترويسات الاستجابة بحثاً عن HIT في الطلب الثاني. تأكد من احترام Cache-Control لديك ومن أن أنواع MIME للصور/الفيديو صحيحة كي يخزّنها المتصفح والحافة بشكل سليم.

6

اضبط الـ purge

عندما تكتب فوق ملف عند العنوان نفسه، نفّذ purge من اللوحة أو عبر cdnctl كي تسقط الحافة النسخة القديمة. بالنسبة للأصول التي تعتمد الإصدار عبر اسم الملف نادراً ما تحتاج هذا، وهو بالضبط سبب التوصية بأسماء مبنية على تجزئة المحتوى للوسائط عالية التغيّر.

سيناريوهات مثال

كتالوج منتجات للتجارة الإلكترونية

تعيش آلاف صور المنتجات في bucket وتتدفق من الحافة، فتبقى صفحات القوائم والتفاصيل سريعة أثناء الحملات دون تحميل خادم تطبيق المتجر.

الفيديو والتنزيلات الكبيرة

تُخزَّن الفيديوهات عند الطلب وملفات التثبيت مرة واحدة وتُقدَّم من التخزين المؤقت، ما يبقي عرض نطاق الأصل ثابتاً حتى عندما ينتشر ملف فجأة انتشاراً واسعاً.

أرشيف نسخ احتياطي معزول

تذهب النسخ الاحتياطية الليلية لقواعد البيانات والملفات إلى bucket خاص بمفتاح access مخصص، تُحفظ خارج مسار التوصيل العام تماماً وقابلة للتدوير عند الطلب.

الأسئلة الشائعة

هل التخزين متوافق فعلاً مع S3 وأدواتي الحالية؟

نعم. تعرض الـ buckets نقطة نهاية متوافقة مع S3، فتعمل aws-cli و s3cmd و rclone وحزم AWS SDK بتوجيهها إلى نقطة النهاية بمفتاح access و secret لديك. ومعظم إضافات الرفع في أنظمة CMS وأطر العمل التي تدعم S3 تعمل بالطريقة نفسها.

هل يصل المستخدمون إلى الـ bucket مباشرة، أم إلى الـ CDN؟

للتوصيل العام تُوجِّه نطاق CDN إلى نقطة نهاية الـ bucket وتنشر ذلك النطاق في شيفرة صفحاتك، فيصل المستخدمون دائماً إلى التخزين المؤقت على الحافة. تبقى نقطة نهاية الـ bucket الخام خلف الـ CDN وليست ما تشير إليه صفحاتك.

كيف أقدم ملفات خاصة دون جعل الـ bucket عاماً؟

أبقِ الكائنات خاصة وأنشئ روابط signed قصيرة العمر بمفتاح access لديك. يمنح الرابط وصولاً محدود الوقت ثم تنتهي صلاحيته، وهو النمط الصحيح للتنزيلات المدفوعة أو الفواتير أو أي شيء لا ينبغي أن يكون عاماً بشكل دائم.

إذا استبدلت صورة باسم الملف نفسه، فلماذا لا تزال القديمة تظهر؟

لأن الحافة خزّنت النسخة السابقة مؤقتاً تحت ذلك العنوان. نفّذ purge لذلك الكائن من اللوحة أو cdnctl، أو اعتمد أسماء ملفات مبنية على تجزئة المحتوى كي يكون لكل إصدار جديد عنوان جديد ولا يحتاج أبداً إلى purge.

ما قيمة Cache-Control التي ينبغي أن أضبطها على الوسائط؟

الأصول طويلة العمر والمُصدَرة ينبغي أن تستخدم max-age بعيد المدى مع immutable؛ والملفات المتغيرة بكثرة ينبغي أن تستخدم TTL أقصر. ضبط الترويسة وقت الرفع هو ما يتيح للحافة الاحتفاظ بالملف بدلاً من إعادة جلبه من الـ bucket.

هل يمكنني إبطال الوصول إذا تسرّب مفتاح؟

نعم. تُدوَّر مفاتيح access وتُبطَل من اللوحة لكل تكامل. ولأنك تصدر مفتاحاً واحداً لكل تطبيق، فإن إبطال مفتاح مسرَّب يؤثر في ذلك التكامل وحده بدلاً من كل خدمة تقرأ من الـ bucket.