دراسات حالة واقعية لتصميم الأنظمة

تصميم خدمة بث الفيديو

18 دقيقة الدرس 6 من 10

تصميم خدمة بث الفيديو

تخدم يوتيوب أكثر من 500 ساعة فيديو يُرفع كل دقيقة وتوصّل أكثر من مليار ساعة مشاهدة يوميًا في أكثر من 100 دولة. يجبرك تصميم نظام بهذا الحجم على حل ثلاث مشكلات صعبة ومتمايزة في آنٍ واحد: الاستيعاب (كيف تتحول الرفعات الخام إلى ملفات قابلة للبث؟)، التخزين (أين تعيش مئات البيتابايتات من الفيديو؟)، والتوصيل (كيف يحصل كل مشاهد على كل جهاز على تشغيل سلس؟). لكل مشكلة قصتها المعمارية الخاصة، وتجتمع معًا لتُشكّل واحدة من أكثر دراسات حالة الأنظمة الموزعة إفادةً.

المتطلبات

المتطلبات الوظيفية:

  • يستطيع المستخدمون رفع مقاطع الفيديو (حتى 10 جيجابايت لكل مقطع).
  • تُحوَّل المقاطع المرفوعة إلى دقات متعددة (360p و720p و1080p و4K) وصيغ متعددة (MP4/H.264 وWebM/VP9 ومقاطع HLS).
  • يستطيع المستخدمون بث الفيديو بمعدل بت تكيفي — تتكيف الجودة تلقائيًا مع عرض النطاق المتاح.
  • يستطيع المستخدمون البحث والإعجاب والتعليق والاشتراك (خارج نطاق هذا الدرس؛ نركز على الرفع والبث).

المتطلبات غير الوظيفية:

  • التوافر: 99.99% — حتى انقطاع بنسبة 0.01% يؤثر على ملايين المشاهدين المتزامنين.
  • زمن الاستجابة: يجب أن يبدأ تشغيل الفيديو خلال ثانيتين؛ وإقرار الرفع خلال 500 ميلي ثانية.
  • الإنتاجية: 500 ساعة/دقيقة رفعًا؛ ذروة النطاق الترددي الصادر في عشرات التيرابت في الثانية عالميًا.
  • المتانة: يجب ألا يُفقد الفيديو المرفوع أبدًا (3 نسخ متكررة جغرافيًا على الأقل).
  • قابلية التوسع: يجب أن تتوسع أفقيًا لكل من الاستيعاب والتوصيل دون إعادة هيكلة.

تقدير الحجم

  • التخزين: 500 ساعة × 60 دقيقة × ~1 جيجابايت/دقيقة خام ≈ 30 تيرابايت فيديو خام في الساعة. بعد تحويل الترميز إلى 5 دقات، تكلفة التخزين لكل جيجابايت خام حوالي 2–3×. عند 30 تيرابايت/ساعة، يعني ذلك 70–90 تيرابايت من التخزين النهائي في الساعة، أو ~650 بيتابايت سنويًا — وهذا هو السبب في امتلاك يوتيوب لمراكز بياناتها الخاصة.
  • النطاق الترددي (الصادر): مليار ساعة مشاهدة/يوم ÷ 86,400 ثانية ≈ ~11.6 مليون بث متزامن. بمعدل بت متوسط 2 ميجابت/ثانية: ~23 تيرابت/ثانية إجمالي الصادر. لا يستطيع أي نقطة حضور CDN منفردة خدمة هذا؛ يتطلب الأمر هرمية CDN عالمية متعددة المستويات.
  • عمال تحويل الترميز: معالجة ساعة واحدة من فيديو 4K تستغرق ~20–40 دقيقة من وقت المعالج لكل دقة. 500 ساعة/دقيقة رفعًا × 5 دقات × 30 دقيقة/مهمة = 75,000 دقيقة معالج من تحويل الترميز في الدقيقة الفعلية — مشكلة حوسبة متوازية هائلة.
رؤية أساسية: التخزين تكلفة لمرة واحدة لكل فيديو، لكن النطاق الترددي متكرر — كل مشاهدة لكل فيديو تستهلك نطاقًا ترددًا صادرًا. تكاليف CDN، لا التخزين، هي التي تهيمن على فاتورة البنية التحتية ليوتيوب. كل قرار هندسي حول كفاءة الترميز ومعدل البت التكيفي ووضع CDN هو في نهاية المطاف عن تخفيض تلك التكلفة.

البنية العامة

يتكون النظام من مستويين متمايزين: خط أنابيب الرفع والمعالجة (كثيف الكتابة، غير متزامن، متسامح مع الزمن) وخط أنابيب التشغيل (كثيف القراءة، متزامن، حساس جدًا للزمن). لا تخلطهما أبدًا — لا يجب أن يتسبب حمل المعالجة في تجويع المشاهدين.

Video streaming service high-level architecture UPLOAD & PROCESSING PIPELINE Creator Client Upload API chunked HTTP Raw Storage Object Store (S3) Job Queue Kafka / SQS Transcoder Worker Pool Processed Storage (S3) Meta DB MySQL resume raw MP4 event update PLAYBACK PIPELINE Viewer Client API Gateway + Load Balancer Metadata Service Cache Redis (meta) CDN Edge PoP (global) Origin Servers Processed S3 play req signed URL cache miss cache-aside
خط أنابيب الرفع والمعالجة (أعلى) مقابل خط أنابيب القراءة والتشغيل (أسفل) — فصل هذين المستويين يمنع ذروات المعالجة من تدهور تجربة المشاهد.

تعمق 1 — خط أنابيب الرفع

رفع فيديو خام قد يصل إلى جيجابايتات. إرساله كطلب HTTP POST واحد هش — قطع شبكي لمدة 30 ثانية يُفشل الرفع بالكامل. بدلًا من ذلك، يُقسّم العميل الملف إلى أجزاء (عادةً 5–20 ميجابايت لكل جزء) ويرفع كل جزء باستقلالية. يُعيد الخادم تجميعها. يُمكّن هذا الرفع القابل للاستئناف: إذا انقطع الاتصال عند الجزء 47، يستأنف العميل من الجزء 48.

تستخدم يوتيوب بروتوكول GCS للرفع القابل للاستئناف. توفر AWS S3 Multipart Upload. النمط دائمًا: (1) ابدأ الرفع ← احصل على معرف الرفع، (2) ارفع الأجزاء بأرقامها، (3) أكمل الرفع ← يقوم التخزين بدمج الأجزاء.

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

تعمق 2 — تحويل الترميز على نطاق واسع

يجب أن يصبح فيديو مرفوع واحد ملفات عديدة — دقات مختلفة (360p و480p و720p و1080p و2160p) وترميزات مختلفة (H.264 لأوسع توافق؛ VP9/AV1 لضغط أفضل بنسبة 30–50%). مضروبًا في 500 ساعة رفع في الدقيقة، هذه مشكلة حوسبة متوازية هائلة.

بنت يوتيوب نظام Transcoder الخاص بها الذي يقسم كل فيديو إلى مقاطع من بضع ثوانٍ، يوزع المقاطع عبر آلاف الأجهزة بالتوازي، ويعيد تجميع النتائج. الفكرة المعمارية الجوهرية: يمكنك موازنة تحويل الترميز على المحور الزمني — يمكن للمقطع 1 أن يُحوَّل ترميزه على الجهاز A بينما المقطع 2 يُحوَّل ترميزه على الجهاز B. هذا يختصر وقت معالجة فيديو مدته ساعتان من ساعات إلى دقائق.

على مستوى الصناعة يُعين هذا النمط على: رسم بياني موجه لا دوري (DAG) من المهام حيث كل عقدة تمثل تحويلًا (تقسيم ← ترميز ← صور مصغرة ← دمج ← نشر). يُنسّق محرك سير العمل (Apache Airflow أو AWS Step Functions أو مشغّل DAG مخصص) هذا الرسم البياني.

Video transcoding DAG pipeline Raw Video Object Store Splitter N segments Encoder 360p H.264 / VP9 Encoder 720p H.264 / VP9 Encoder 1080p H.264 / VP9 Encoder 4K AV1 Thumbnails Merger reassemble HLS Packager .m3u8 manifests CDN Origin Push
رسم بياني DAG لتحويل الترميز: يوزع المقسّم المقاطع على عمال ترميز متوازيين؛ يُعيد الدامج تجميعها؛ يكتب مُعبّئ HLS مناشير البث التكيفي؛ يستقبل أصل CDN الأصول النهائية.

تعمق 3 — بنية التخزين

تعيش بيانات الفيديو في مخزن الكائنات (Amazon S3 أو Google Cloud Storage أو نظام ملفات Colossus الخاص بيوتيوب). مخازن الكائنات مثالية لأن:

  • الملفات غير قابلة للتغيير بعد الكتابة — لا تعارضات تحديث، لا قفل.
  • تتوسع إلى إكسابايتات دون ترحيل للمخطط.
  • لها واجهة مفتاح-قيمة مسطحة: bucket/videoId/720p/segment_042.ts.
  • تدعم سياسات دورة الحياة: نقل الفيديوهات النادرة الوصول تلقائيًا إلى تخزين بارد أرخص.

تعيش البيانات الوصفية (العنوان والوصف والمالك وعدد المشاهدات والحالة وعناوين URL للدقات) في قاعدة بيانات علائقية (MySQL مع نسخ قراءة في يوتيوب). تستخدم عدادات المشاهدات والإعجابات والتعليقات خدمة عداد منفصلة تقبل حركة كتابة عالية وتُفرغ دوريًا في قاعدة البيانات الرئيسية — لا تستطيع تحمّل قفل على مستوى الصف في جدول الفيديوهات لكل حدث تشغيل.

تعمق 4 — توصيل CDN ومعدل البت التكيفي

خدمة 23 تيرابت/ثانية من أصل واحد مستحيلة فيزيائيًا. الحل هو شبكة توصيل المحتوى (CDN): شبكة عالمية من مئات نقاط الحضور (PoPs) التي تخزّن مقاطع الفيديو مؤقتًا بالقرب من المشاهدين. تُشغّل يوتيوب CDN خاصة بها (Google Global Cache) مُكمَّلة بذاكرات تخزين مؤقت مُضمَّنة في مزودي خدمة الإنترنت.

البروتوكول الذي يُمكّن البث السلس عبر اتصالات متغيرة عرض النطاق هو HTTP Live Streaming (HLS). كيف يعمل:

  1. يُنتج مُعبّئ HLS مانيفيست رئيسي (.m3u8) يسرد جميع مستويات الجودة المتاحة.
  2. لكل مستوى جودة مانيفيست وسائط خاص يسرد مقاطع قصيرة (ملفات .ts، عادةً 6–10 ثوانٍ لكل منها).
  3. يُنزّل المشغّل المانيفيست الرئيسي، ويختار جودة أولية بناءً على عرض النطاق الحالي، ويبدأ جلب المقاطع.
  4. بعد كل مقطع، يقيس المشغّل إنتاجية التنزيل. إذا انخفض عرض النطاق، ينتقل إلى مانيفيست جودة أقل للمقطع التالي — بسلاسة، في منتصف الفيديو.
لماذا مقاطع قصيرة؟ مقطع مدته 6 ثوانٍ يعني أن المشغّل يستطيع تبديل الجودة كل 6 ثوانٍ. مقاطع أقصر = تكيف أكثر استجابة لكن عبء HTTP أعلى. 6–10 ثوانٍ هي النقطة المثلى في الصناعة.

تُخزّن CDN كلًا من مقاطع الفيديو الثابتة (TTL طويل، فعليًا إلى الأبد) والمناشير (TTL أقصر لنشر تغييرات مستوى الجودة). تحمي عناوين URL الموقّعة أو الرموز المميزة المحتوى المدفوع: يُصدر خادم API عنوان URL محدود الوقت موقّعًا بـ HMAC؛ تتحقق حافة CDN من التوقيع قبل تقديم المقطع.

مشكلة شائعة — مشكلة الانطلاق البارد: الفيديو الجديد تمامًا لا يوجد في ذاكرة التخزين المؤقت لـ CDN. إذا نشر منشئ يمتلك 10 ملايين مشترك فيديوًا ونقر الجميع في نفس الوقت، تُفشل جميع الطلبات في CDN وتنهال على الأصل في وقت واحد. الحلول: (1) تسخين مسبق لحافات CDN بدفع الفيديوهات الشائعة الجديدة قبل أن يصبح عنوان URL العام حيًا، (2) استخدام تجميع طلبات CDN (جلب أصلي واحد فقط لكل نقطة حضور لكل إخفاق تخزين مؤقت)، و(3) تقييد معدل الأصل حتى لا يسقط أثناء فترة التسخين.

ملخص المقايضات

القرارالنهج المختارالمقايضة المقبولة
موثوقية الرفعرفع مُجزَّأ / قابل للاستئنافتعقيد أكبر في العميل؛ لا فشل لرفع متعدد الجيجابايتات
زمن تحويل الترميزطابور غير متزامن + عمال متوازيونالفيديو ليس متاحًا فورًا؛ يرى المنشئ تأخير المعالجة
تخزين الفيديومخزن كائنات غير قابل للتغييرلا تعديلات في المكان؛ إعادة الترميز عند تغيير الجودة
بروتوكول البثHLS (معدل بت تكيفي)المناشير تضيف تعقيدًا؛ أفضل من التخزين المؤقت بمعدل بت ثابت
تخزين البيانات الوصفيةقاعدة بيانات علائقية + نسخ قراءةنسخ قراءة متسقة نهائيًا؛ عدادات المشاهدات في خدمة منفصلة
التوصيلCDN متعدد المستوياتتعقيد إبطال الذاكرة المؤقتة؛ توفير هائل في النطاق الترددي