distributed system میں، سب کچھ بالآخر ناکام ہو جاتا ہے۔ Resilience patterns ایک ہی ناکامی کو مکمل outage میں تبدیل ہونے سے روکتے ہیں۔
distributed system میں، سب کچھ بالآخر ناکام ہو جاتا ہے۔ Resilience patterns ایک ہی ناکامی کو مکمل outage میں تبدیل ہونے سے روکتے ہیں۔
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.
Backoff کے بغیر Retries پہلے سے جدوجہد کر رہی service پر load کو بڑھاتی ہیں (ایک retry storm)۔ ہمیشہ backoff، jitter، اور retry cap شامل کریں۔
یہ نمونے وہ ہیں جو ایک ناگزیر single-service ناکامی کو site-wide outage کی بجائے ایک خراب feature میں بدل دیتے ہیں۔
یہ ایک ساتھ کام کرتے ہیں: timeouts انتظار کو محدود کرتے ہیں، circuit breakers مردہ services پر hammering بند کرتے ہیں، bulkheads blast radius کو محدود کرتے ہیں، اور retries blips سے recover کرتے ہیں — ہر ایک کو چھوڑ دیں اور ناکامیاں اب بھی cascade ہوتی ہیں۔