Circuit Breaker
قاطع الدائرة (Circuit Breaker) Circuit Breaker
نمط يمنع استدعاء خدمة متعطلة بشكل متكرر، فيمنحها وقتاً للتعافي ويحمي النظام من الفشل المتسلسل.
بلا حماية، استدعاء متكرر لخدمة معطلة يهدر موارد الخدمة المستدعية (اتصالات، خيوط تنفيذ) وقد يُسقط النظام بأكمله — ما يُعرف بالفشل المتسلسل (Cascading Failure). Circuit Breaker يراقب نسبة فشل الاستدعاءات، وعند تجاوزها حداً معيناً "يفتح الدائرة" ويرفض الاستدعاءات فوراً دون محاولة الاتصال الفعلي، ثم يجرّب الاتصال مجدداً بعد مهلة.
الصياغة
CLOSED (طبيعي) → [نسبة فشل عالية] → OPEN (رفض فوري) → [بعد مهلة] → HALF_OPEN (تجربة) → CLOSED أو OPEN
📄 مثال
const breaker = new CircuitBreaker(callUserService, {
timeout: 3000,
errorThresholdPercentage: 50,
resetTimeout: 30000,
});
breaker.on('open', () => log('warn', 'circuit opened'));
const user = await breaker.fire(userId);أهم النقاط
| العنصر | الوظيفة |
|---|---|
| CLOSED | الحالة الطبيعية — الطلبات تمر وتُحتسب نسبة نجاحها |
| OPEN | الطلبات تُرفض فوراً دون محاولة اتصال فعلي |
| HALF_OPEN | طلب تجريبي واحد لفحص هل تعافت الخدمة |
💡 نصائح عملية
- ضع دائماً Timeout واضح على الاستدعاء — بدونه Circuit Breaker لا يعرف متى يعتبر الطلب فاشلاً
- أرفقه بـ Fallback (قيمة افتراضية أو بيانات مخزّنة مؤقتاً) بدل مجرد رفض الطلب
⚠️ أخطاء شائعة
- تطبيق Circuit Breaker على استدعاءات حرجة دون خطة Fallback لما يحدث عند فتح الدائرة
- ضبط عتبة فشل منخفضة جداً فتفتح الدائرة عند تذبذب طبيعي بسيط في الشبكة
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار MICROSERVICES الكامل بالعربي.