في نظام موزع، كل شيء يفشل في النهاية. تحقق أنماط المرونة من أن فشل واحد لا ينتشر إلى انقطاع كامل.
const breaker = new CircuitBreaker(callPaymentService, {
timeout: 3000, // fail the call after 3s
errorThresholdPercentage: 50, // open if >50% of calls fail
resetTimeout: 10000 // after 10s, try one request (half-open)
});
breaker.fallback(() => ({ status: 'queued' })); // graceful degradation
CLOSED ──(failures exceed threshold)──▶ OPEN
▲ │ (after resetTimeout)
│ (trial succeeds) ▼
└────────────── HALF-OPEN ◀──────────────┘
(one trial request)
[ pool A: 10 threads ] → payment calls
[ pool B: 10 threads ] → search calls
If search hangs, it drains pool B only — payments keep working.
إعادة المحاولة بدون تراجع تضخم الحمل على خدمة تعاني بالفعل (عاصفة إعادة محاولة). أضف دائماً التراجع والتشويش وحد أقصى لإعادة المحاولة.
هذه الأنماط هي ما تحول فشل خدمة واحد حتمي إلى ميزة متدهورة بدلاً من انقطاع في الموقع بالكامل.
تعمل معاً: المهل الزمنية تحد من الانتظار، قواطع الدائرة توقف الاستدعاءات المتكررة للخدمات الميتة، الحواجز تحتوي على دائرة الانفجار، وإعادات المحاولة تتعافى من الأعطال البسيطة — حذف أي واحد منها وسوف تنتشر الأخطاء.