العُقد، والحواف، والاتجاهات
الطلب كمشية على رسم بياني
كل مكوّن يلمسه الطلب هو عقدة: العميل، محلل DNS، حافة CDN، وكيل عكسي، نسخة خلفية، قاعدة البيانات، ذاكرة التخزين المؤقت.
كل اتصال بين عقدتين هو حافة موجّهة: الطلبات تتدفق للأمام، والاستجابات تعود للخلف. الحافة الأمامية تمثل اتصال TCP مفتوحًا بالإضافة إلى البروتوكول فوقه.
الطلب الفردي هو مسار عبر هذا الرسم البياني. إجمالي العمل الذي تنفذه النظام للإجابة على الطلب يساوي مجموع العمل في كل عقدة، بالإضافة إلى زمن الاستجابة (Latency) لكل حافة.
لماذا نهتم؟ بمجرد رسم الرسم البياني، تظهر خصائص غير مرئية في الكود:
- عدد القفزات (Hop count): عدد الحواف في المسار. كل قفزة تضيف زمن استجابة (جولة شبكة + معالجة عقدة). قفزات أقل = حد أدنى أقل لزمن الاستجابة.
- الدرجة الداخلة (In-degree): عدد الحواف التي تشير إلى عقدة. درجة داخلية عالية تعني أن العقدة تستقبل طلبات من مصادر عديدة ويجب أن تتوسع أو تحمي نفسها.
- الدرجة الخارجة (Out-degree): عدد الحواف التي تشير من عقدة. درجة خارجة عالية تعني أن العقدة تعتمد على العديد من الأنظمة المنخفضة (downstreams) ولديها طرق عديدة للفشل.
- عقدة القطع (Cut vertex): عقدة واحدة يؤدي إزالتها إلى فصل الرسم البياني. وكيل عكسي (reverse proxy) بدون نظير هو عقدة قطع؛ إزالته تحجب جميع الوصول إلى أصوله (origins).
أين يتراكم المرور
التجميع = التركيز
الدرجة الداخلة للعقدة = عدد الحواف التي تشير إليها. في رسم طلبات، الدرجة الداخلة = عدد المصادر العلوية التي ترسل الطلبات.
نمط التجميع (Fan-in): عملاء كثيرون -> CDN واحد؛ حواف CDN كثيرة -> وكلاء أصل (Origin Proxies) قليلون؛ وكلاء كثيرون -> نسخ خلفية (Backend Replicas) أقل؛ خوادم خلفية كثيرة -> قاعدة بيانات واحدة.
الأهمية تكمن في أن العقدة ذات الدرجة الداخلة (In-degree) الأعلى ترى الحمل المجمّع الأكبر. قد ترى قاعدة البيانات في نهاية السلسلة استعلامات من كل طلب نشط في النظام بأكمله، حتى لو لم يولّد مستخدم واحد حملاً كبيراً.
التفرع (Fan-Out) = الاعتمادية
الدرجة الخارجة (Out-degree) لعقدة = عدد الحواف المنطلقة منها. الدرجة الخارجة العالية تعني وجود اعتماديات هابطة (Downstream) كثيرة.
خادم خلفي يستدعي قاعدة بيانات، وخمستين (Two) كاشات، وثلاثة واجهات برمجة تطبيقات (APIs) خارجية، و طابوراً (Queue) لديه درجة خارجة تساوي 7. احتمالية نجاحه هي تقريباً حاصل ضرب احتمالية نجاح كل اعتمادية هابطة (إذا كانت جميعها مطلوبة للحصول على استجابة ناجحة).
0.999 ^ 7 ≈ 0.993: خادم خلفي لديه 7 اعتماديات هابطة، كل منها بموثوقية 99.9%، لا يمكنه تحقيق موثوقية أعلى من ~99.3% بنفسه، حتى لو كان خالياً من الأخطاء البرمجية.
قلل الدرجة الخارجة عن طريق: تخزين نتائج الاعتماديات الهابطة مؤقتاً (Caching)، جعل الاعتماديات غير الحرجة اختيارية (التدهور السليم - Graceful Degradation)، وتوازي (Parallelizing) ما يمكن توازيه.
عدم التماثل
يُركّز التجميع (Fan-in) الحمل، بينما يُضاعف التوزيع (Fan-out) المخاطر. تُقلّل الرسوم البيانية المُصممة بشكل جيد من كلا الأمرين عند العقد ذات التأثير الأكبر.
قاعدة البيانات (أعلى درجة تجميع): استخدم التخزين المؤقت (Caching) بشكل عدواني لتقليل الحمل. استخدم النسخ القارئة (Read Replicas) لتوزيع التجميع عبر عدة عقد.
خدمة المنسّق (أعلى درجة توزيع): استخدم قواطع الدائرة (Circuit Breakers) لكل اعتمادية، والتدهور السليم (Graceful Degradation)، والأحواجز (Bulkheads).
العقدة المُدخلة تمنح مرونة
التبديل غير المباشر = إضافة عقدة وسيطة
بدون وكيل (Proxy)، يكون الرسم البياني كالتالي: client -> backend. يجب أن يعرف العميل عنوان الخلفية. إن نقل الخلفية يتطلب تحديث العميل (عبر DNS أو الإعدادات). هذا ارتباط وثيق.
مع وجود وكيل، يصبح الرسم البياني كالتالي: client -> proxy -> backend. يعرف العميل فقط عن الوكيل. إن نقل الخلفية يتطلب تحديث إعدادات المنبع (upstream) للوكيل، وليس العميل.
عملية الرسم البياني: إدخال عقدة على حافة موجودة. الحافة الجديدة client -> proxy مستقرة؛ أما الحافة الجديدة proxy -> backend فهي الآن تحت إدارة الفريق.
القراءة الهندسية: يضيف التبديل غير المباشر طبقة تفصل التغيير في المنبع عن التغيير في المصب. يمكن إعادة توصيل حواف كل طبقة بشكل مستقل.
تكلفة غير المباشر (Indirection)
تضيف كل طبقة:
- قفزة إضافية من زمن الاستجابة (الحافة من العميل إلى الوسيط)
- نقطة قطع إضافية على المسار (الوسيط نفسه)
- مكاناً إضافياً يمكن أن يحدث فيه خطأ في الإعداد
عادةً ما تفوق الفوائد (إعادة التوصيل، التوسع، الحماية، إنهاء TLS، توزيع الحمل) التكاليف في أي نظام غير تافه. لكن هناك حدّ: كل طبقة غير مباشر تضيف قفزة أخرى ومرشحاً آخر لنقطة فشل مفردة (SPOF).
القاعدة الشائعة: يمكن حل أي مشكلة بإضافة طبقة من غير المباشر (باستثناء مشكلة وجود طبقات كثيرة من غير المباشر).
قراءة البنية المعمارية كرسوم بياني
التوليف
يمكنك الآن قراءة معمارية النظام كرسوم بيانية: عدّ القفزات، وحدد نقاط القطع، وقِس تركّز المدخلات (Fan-in)، وحسب السقف الأقصى للتوفر من خلال المخرجات (Fan-out)، وقيّم مفاضلات غير المباشر (Indirection).
طبّق الأربعة جميعها.
لدى خدمة جديدة هذه المعمارية: clients -> CDN -> reverse proxy (2 replicas) -> backend tier (8 replicas) -> { DB primary, cache cluster (3 nodes), external API }.
ملاحظات مرافقة
ملاحظات مرافقة
يعيد درس الهندسة هذا صياغة الدرس الرئيسي الوكلاء والأصول كتحليل لمخطط موجّه.
يتناول الدرس المرافق التالي في هذا المساق، geometry_of_stateless_horizontal_scaling، حسابات النسخ من درس التوسع الرئيسي، ويستنتج منحنى الطوابير، وقانون ليتل، ونقطة الانحناء عند 80% من معدل الاستخدام هندسياً.
أحسنت.