سياسات الصمود في الشبكة الخدماتية
سياسات الصمود في الشبكة الخدماتية
كان أحد الوعود الأصيلة للشبكة الخدماتية هو نقل منطق الصمود من مكتبات التطبيقات إلى طبقة البنية التحتية. قبل Istio، كانت كل فريق يستنسخ أكواد إعادة المحاولة وقواطع الدائرة من أطر عمل كـ Hystrix وResilience4j وPolly — بإعدادات متباينة طفيفاً ومهل زمنية غير متسقة وبلا رصد موحد. تجعل الشبكة هذه السياسات تصريحية وموحدة وقابلة للرصد عبر كل خدمة في الكتلة دون تغيير سطر واحد من كود التطبيق.
لكن هذا التوحيد ذاته يصبح خطراً إذا أسأت ضبطه. إعادة المحاولات المُضبَطة بشكل خاطئ تُحدث عواصف طلبات تُحوّل انقطاعاً جزئياً إلى كامل. وقواطع الدائرة المُضبَطة بعدوانية مفرطة تتخلص من حركة مرور كان يمكنها أن تنجح. تتناول هذه الدرس الآليات الأربع للصمود التي يوفرها Istio — إعادة المحاولات، والمهل الزمنية، وقطع الدائرة، وكشف الحالات الشاذة — وكيف يضبطها المهندسون الكبار لأحمال الإنتاج على نطاق واسع.
إعادة المحاولات
تنتمي إعادة المحاولات في الشبكة إلى المسارات الاستهلاكية للقراءة ذات الطابع التكراري — طلبات GET، والبحث في ذاكرة التخزين المؤقت، وقواعد البيانات المتكررة. ينبغي نادراً ضبطها على عمليات الكتابة دون ضمانات تكافؤ على مستوى التطبيق (معرفات طلبات فريدة، ورموز إزالة التكرار). في Google وAmazon، الإرشاد الداخلي هو التحفظ في عدد المحاولات وتقييدها دائماً بميزانية محددة.
تُضبَط إعادة محاولات Istio في VirtualService. الحقول الرئيسية هي: attempts (الحد الأقصى لعدد المحاولات)، وperTryTimeout (المهلة لكل محاولة منفردة)، وretryOn (الشروط التي تُطلق إعادة المحاولة). حقل retryOn بالغ الأهمية — القيمة الافتراضية connect-failure,refused-stream,unavailable,cancelled,retriable-4xx معقولة لكن عليك فهم معنى كل حالة في نمط حركة مرورك.
attempts: 3 تتضاعف الطلبات ثلاثة أضعاف على الخادم الخلفي مؤقتاً — من 1000 إلى 3000 — تحديداً حين يكون في ضائقة أصلاً. تصف أدبيات Google SRE هذا بـ عاصفة إعادة المحاولات. تخفيفها يتطلب: (1) إبقاء attempts بين 2 و3 كحد أقصى، (2) إقران إعادة المحاولات بالتراجع الأسي مع التشويش على مستوى العميل (ليس مدمجاً في Istio)، (3) وضع ميزانية للمحاولات عند طبقة موازن الحمل بحيث لا تتجاوز 10% من الطلبات الكلية.المهل الزمنية
المهل الزمنية هي أكثر المقابض تأثيراً في النظام الموزع. غياب المهلة يعني أن خادماً أعلى متوقفاً يمكنه الإمساك بخيط تنفيذ وفتحة في تجمع الاتصالات وروتين غوروتين إلى أجل غير مسمى — استنزاف موارد متتالٍ يُحوّل بوداً بطيئاً واحداً إلى حادثة على مستوى الكتلة. تفرض الشبكة المهل الزمنية حتى حين ينساها التطبيق.
حقل timeout في VirtualService هو المهلة الكلية للطلب شاملة جميع محاولات إعادة المحاولة. الخطأ الشائع هو ضبط timeout: 3s مع attempts: 3 وperTryTimeout: 2s — الحساب لا يستقيم وIstio يبتر صامتاً عند المظروف الزمني. تحقق دائماً: total_timeout >= attempts * perTryTimeout + overhead.
على نطاق الإنتاج، تحتاج فئات حركة المرور المختلفة إلى ملفات مهل مختلفة. يسمح Istio بالمطابقة على الترويسات أو بادئات URI أو تسميات المصدر لتطبيق سياسات لكل مسار — مثلاً 500ms للاستدعاءات المتزامنة API و30s لنقاط نهاية التصدير الدُفعي على الخدمة ذاتها.
قطع الدائرة
قطع الدائرة هو تحكم على طبقة الاتصال. على عكس إعادة المحاولات والمهل التي تعمل على الطلبات الفردية، يحد قاطع الدائرة من التزامن وعمق قائمة الانتظار لوجهة ما. في Istio يُضبَط هذا عبر DestinationRule بكتلة trafficPolicy.connectionPool.
المعاملات الرئيسية هي: http1MaxPendingRequests / http2MaxRequests (حدود قائمة الانتظار/التزامن)، وmaxRequestsPerConnection (يُجبر على إعادة الاتصال لتفادي الاتصالات القديمة طويلة الأمد)، وmaxRetries (يقيّد تزامن إعادة المحاولة على مستوى تجمع الاتصالات، مستقلاً عن عدد محاولات VirtualService).
http1MaxPendingRequests، يُعيد Envoy فوراً 503 UO (تجاوز المنبع) للطلبات الجديدة دون إعادة توجيهها. يظهر هذا في المقاييس كـ upstream_rq_pending_overflow. "تُغلق الدائرة" تلقائياً بمجرد استنزاف الطلبات المعلقة — لا توجد انتقالات حالة صريحة للمراقبة.كشف الحالات الشاذة
كشف الحالات الشاذة هو مكافئ الشبكة لـ الفحص الصحي السلبي. يراقب ردود حركة المرور الفعلية من كل بود فردي في المنبع ويُقصي المضيفين الذين يُظهرون سلوكاً شاذاً من تجمع موازنة الحمل لفترة تهدئة. هذا مختلف جوهرياً عن قطع الدائرة: قطع الدائرة يحد من حركة المرور إلى الخدمة بأكملها، بينما يُقصي كشف الحالات الشاذة البودات السيئة المنفردة من المجموعة الفرعية.
هذا الأمر بالغ الأهمية في الأساطيل الكبيرة. نشر Deployment بـ 50 نسخة حيث يعاني بودان من تسرب ذاكرة يجعلهما يُعيدان 5xx عند كل طلب ثالث سيُدهور جميع العملاء بنسبة 4% من الوقت — لا يكفي لإطلاق تنبيه، لكنه كافٍ لانتهاك SLO. يُقصي كشف الحالات الشاذة هذين البودين بصمت بينما الـ 48 الأخرى تخدم حركة مرور نظيفة. تؤدي الشبكة العمل الذي كان سيستلزم من إنسان تتبع معدلات الخطأ لكل بود في Prometheus ثم تنفيذ kubectl cordon يدوياً للعقدة.
تفاعل المعاملات الحرج الذي يجب استيعابه هو maxEjectionPercent. هذا هو الحد الأمان: إذا كانت حدود الكشف مشددة للغاية وبدأت في إقصاء بودات سليمة خلال ارتفاع الحمل (الذي يولد أيضاً أخطاء عابرة)، لن يُقصي Istio ما يتجاوز هذه النسبة المئوية من التجمع. ضبطها عالياً جداً (100%) يُخاطر بإقصاء الأسطول بأكمله. القيمة الآمنة للإنتاج هي 50% لمعظم الخدمات؛ وتُخفَّض إلى 25-30% للخدمات ذات الحالة أو الخدمات الفردية.
DestinationRule للخدمات الحرجة. قطع الدائرة (connectionPool) يحمي من الحمل الزائد المتزامن للخدمة ككل. كشف الحالات الشاذة يحمي من النسخ السيئة الفردية التي تُفسد معدل نجاحك. ظهور كلاهما في كتلة DestinationRule ذاتها، كما هو مُبيَّن في مثال المدفوعات أعلاه، هو النمط القياسي في الإنتاج لدى شركات التقنية الكبرى التي تشغل Istio على نطاق واسع.مراقبة سلوك سياسات الصمود
السياسات المُضبَطة لكنها غير مُتحقق منها تشكل عبئاً. بعد كل تغيير في إعداد إعادة المحاولة/المهلة/قاطع الدائرة، تحقق من السلوك عبر واجهة API الإدارية لـ Envoy ومقاييس Prometheus. أكثر الإشارات إفادة:
envoy_cluster_upstream_rq_pending_overflow— الطلبات التي أسقطها قاطع الدائرة (تجاوز تجمع الاتصالات).envoy_cluster_outlier_detection_ejections_active— عدد المضيفين المُقصَيين حالياً؛ نبّه إذا كان غير صفري لأكثر من دقيقتين.envoy_cluster_upstream_rq_retryوenvoy_cluster_upstream_rq_retry_success— حجم إعادة المحاولة ومعدل النجاح. معدل نجاح أقل من 60% يعني أنك تُعيد المحاولة على إخفاقات غير عابرة.istio_requests_total{response_flags="UO"}— تجاوز المنبع؛ إشارة مباشرة أن قطع الدائرة يُسقط حركة مرور بنشاط.
في الشركات التي تشغل Istio على آلاف الخدمات، تُدار سياسات الصمود في مستودع GitOps مركزي وتُصيَّر كقوالب VirtualService / DestinationRule لكل طبقة خدمة — لا تُصنع يدوياً لكل فريق. توجد ملفات إعداد افتراضية (صارم/مرن/معطل) لطبقات الخدمة، وتختار الفرق ملف إعداد أشد للمسارات الحرجة كالمدفوعات. هذا يمنع الانجراف في الإعدادات الذي يُصعّب تشخيص حوادث الإنتاج حين يكون لكل خدمة دلالات إعادة محاولة مختلفة طفيفاً.