Saeid Noormohammadi
Saeid Noormohammadi
خواندن ۱ دقیقه·۲ ماه پیش

Retry Storm Antipattern

آنتی پترن Retry Storm زمانی اتفاق می افتد که تعداد زیادی کلاینت درخواست های ناموفق خود را تکرار کنند. در این سناریو با تکرار همزمان درخواست ها در تعداد بالا فشار بر روی سرویس زیاد می شود که می تواند باعث کندی یا در برخی مواقع داون شدن سرویس شود.

فرض کنید سرویس مدیریت سفارش ها به هر دلیلی کند عمل می کند یا از دسترس خارج شده است. حال اگر کلاینت ها بابت هر درخواست که با شکست مواجه می شود درخواست های خود را بدون منطق تکرار کنند فشار بر روی سرویس افزایش پیدا می کند که این فشار ممکن است مشکلات مربوط به سرویس سفارش را بیشتر کرده و حتی موجب داون شدن کامل آن شود.

راه حل ها
دیزاین پترن Circuit Breaker:
هنگامی که یک سرویس با مشکل مواجه شده یا در دسترس نمی باشد می توان به طور موقت درخواست ها را کاهش داده یا به طور کامل درخواست ها را متوقف کرد تا سرویس خود را بازیابی کند.
الگوریتم عقب گردنمایی یا بازگشت نمایی (Exponential Backoff): بعد از اینکه درخواست با شکست مواجه شد به جای تکرار درخواست به صورت بلافاصله, با افزایش زمان درخواست بعدی به شکل تصاعدی به سرویس فرصت می دهیم که خود را بازیابی کند.
محدودیت در Retry: تعداد retry ها را به شکل اصولی و محدود تنظیم می کنیم.

شاید موارد بالا ساده به نظر برسند, اما شخصا تو خیلی از سرویس ها دیدم که به صورت غیر اصولی در تعداد بالا و با فاصله زمانی کم retry انجام میدن. از Circuit Breaker هم که خیلی کم یا به شکل اشتباه استفاده می کنند. مشکلات ناشی از این آنتی پترن در پروژه های پیچیده و با لود بالا بیشتر به چشم میاد.

retrystormexponentialbackoffcircuitbreakersystemdesign
شاید از این پست‌ها خوشتان بیاید