Circuit Breaker و Resilience
تابآوری سیستم: Timeout، Retry با Backoff، Circuit Breaker و Bulkhead — زنده ماندن وقتی دیگری میمیرد
زنجیره سقوط (Cascading Failure)
سرویس پرداخت کند شد → همه درخواستها منتظر → Threadها تمام → سرویس سفارش هم قفل! → کل سیستم پایین!
یک سرویس کند = مرگ همه — مگر اینکه تابآوری (Resilience) طراحی کنید:
۱. Timeout — منتظر بیپایان نمان
هر فراخوانی شبکه باید timeout داشته باشد! «۳ ثانیه جواب نداد؟ رها کن» — منابع آزاد میمانند.
۲. Retry با Exponential Backoff
خطای گذرا (شبکه لرزید)؟ دوباره امتحان — اما هوشمند:
تلاش ۱ → صبر ۱ ثانیه
تلاش ۲ → صبر ۲ ثانیه
تلاش ۳ → صفر ۴ ثانیه → تسلیم!
+ Jitter (تصادفی): همه همزمان retry نکنند!
⚠️ فقط برای عملیات idempotent! (retry پرداخت غیر idempotent = دو برداشت!)
۳. Circuit Breaker — فیوز برق!
سه حالت:
| حالت | رفتار |
|---|---|
| CLOSED (عادی) | درخواستها میروند؛ خطاها شمرده میشوند |
| OPEN (قطع!) | خطا > حد → «فیوز سوخت»: همه درخواستها فوری رد! |
| HALF-OPEN (آزمایش) | بعد از مدت: چند درخواست آزمایشی → موفق = CLOSED |
فایده: سرویس در حال مرگ، فرصت بهبود میگیرد (نه سیل مجدد!) و ما fail-fast میکنیم.
۴. Bulkhead — اتاقهای آببندی
منابع جدا برای هر وابستگی: Pool پرداخت ۱۰۰ Thread، Pool ایمیل ۲۰ — ایمیل مرد؟ پرداخت سالم میماند! (مثل اتاقهای کشتی — سورط یکی، کشتی غرق نه!)
۵. Fallback — جایگزین
سرویس پیشنهاددهی مرد؟ «محبوبترینها» از کش نشان بده — تجربه کاربر نجات مییابد!
جمعبندی
- Timeout: منتظر ابدی ممنوع
- Retry: backoff + jitter + فقط idempotent
- Circuit Breaker: فیوز سهحالته
- Bulkhead + Fallback: جداسازی و جایگزین
این مبحث بخشی از دوره آموزش کامل طراحی سیستم (System Design) است.