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 — جایگزین

سرویس پیشنهاددهی مرد؟ «محبوب‌ترین‌ها» از کش نشان بده — تجربه کاربر نجات می‌یابد!

نکته: این الگوها در کتابخانه‌ها آماده‌اند (Resilience4j، Polly، Hystrix قدیمی) — اما فهم «چرا» هرکدام، تفاوت مهندس ارشد است!

جمع‌بندی

این مبحث بخشی از دوره آموزش کامل طراحی سیستم (System Design) است.

ابزارهای مرتبط