فارسی

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

الگوی مدارشکن: یک الگوی مستحکم تحمل خطا برای اپلیکیشن‌های مدرن

در دنیای توسعه نرم‌افزار، به ویژه در معماری‌های میکروسرویس و سیستم‌های توزیع‌شده، تضمین تاب‌آوری اپلیکیشن از اهمیت بالایی برخوردار است. هنگامی که اجزا از کار می‌افتند، جلوگیری از خرابی‌های زنجیره‌ای و حفظ یک تجربه کاربری پایدار و پاسخگو حیاتی است. الگوی مدارشکن به عنوان یک راه‌حل قدرتمند برای دستیابی به تحمل خطا و افت کیفیت کنترل‌شده (graceful degradation) در چنین سناریوهایی ظهور می‌کند.

الگوی مدارشکن چیست؟

الگوی مدارشکن از مدارشکن‌های الکتریکی الهام گرفته شده است که مدارها را از آسیب ناشی از جریان بیش از حد محافظت می‌کنند. در نرم‌افزار، این الگو به عنوان یک پروکسی برای عملیاتی که ممکن است با شکست مواجه شوند عمل می‌کند و از تلاش مکرر اپلیکیشن برای اجرای عملیاتی که احتمالاً شکست می‌خورد، جلوگیری می‌کند. این رویکرد پیشگیرانه از هدر رفتن منابع جلوگیری کرده، تأخیر را کاهش می‌دهد و در نهایت پایداری سیستم را افزایش می‌دهد.

ایده اصلی این است که وقتی یک سرویس به طور مداوم پاسخ نمی‌دهد، مدارشکن «باز» می‌شود و از ارسال درخواست‌های بیشتر به آن سرویس جلوگیری می‌کند. پس از یک دوره زمانی مشخص، مدارشکن وارد حالت «نیمه‌باز» می‌شود و به تعداد محدودی از درخواست‌های آزمایشی اجازه عبور می‌دهد. اگر این درخواست‌ها موفقیت‌آمیز باشند، مدارشکن «بسته» شده و عملکرد عادی از سر گرفته می‌شود. اگر شکست بخورند، مدارشکن باز باقی می‌ماند و این چرخه تکرار می‌شود.

حالت‌های مدارشکن

مدارشکن در سه حالت مجزا عمل می‌کند:

مزایای استفاده از الگوی مدارشکن

پیاده‌سازی الگوی مدارشکن چندین مزیت کلیدی را به همراه دارد:

ملاحظات پیاده‌سازی

پیاده‌سازی مؤثر الگوی مدارشکن نیازمند بررسی دقیق چندین عامل است:

نمونه‌های پیاده‌سازی

الگوی مدارشکن را می‌توان با استفاده از زبان‌های برنامه‌نویسی و فریمورک‌های مختلف پیاده‌سازی کرد. در اینجا چند نمونه آورده شده است:

جاوا با Resilience4j

Resilience4j یک کتابخانه محبوب جاوا است که مجموعه جامعی از ابزارهای تحمل خطا، از جمله مدارشکن، تلاش مجدد (Retry)، محدودکننده نرخ (Rate Limiter) و Bulkhead را ارائه می‌دهد. در اینجا یک مثال ساده آورده شده است:


CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
    .failureRateThreshold(50)
    .waitDurationInOpenState(Duration.ofMillis(1000))
    .permittedNumberOfCallsInHalfOpenState(2)
    .slidingWindowSize(10)
    .build();

CircuitBreaker circuitBreaker = CircuitBreaker.of("myService", circuitBreakerConfig);

Supplier<String> decoratedSupplier = CircuitBreaker
    .decorateSupplier(circuitBreaker, () -> myRemoteService.getData());

try {
    String result = decoratedSupplier.get();
    // Process the result
} catch (RequestNotPermitted e) {
    // Handle the open circuit
    System.err.println("Circuit is open: " + e.getMessage());
}

پایتون با Pybreaker

Pybreaker یک کتابخانه پایتون است که یک پیاده‌سازی ساده و آسان از مدارشکن را ارائه می‌دهد.


import pybreaker

breaker = pybreaker.CircuitBreaker(fail_max=3, reset_timeout=10)

@breaker
def unreliable_function():
    # Your unreliable function call here
    pass

try:
    unreliable_function()
except pybreaker.CircuitBreakerError:
    print("Circuit Breaker is open!")

دات‌نت با Polly

Polly یک کتابخانه دات‌نت برای تاب‌آوری و مدیریت خطاهای گذرا است که به توسعه‌دهندگان اجازه می‌دهد تا سیاست‌هایی مانند تلاش مجدد، مدارشکن، وقفه زمانی و Bulkhead را به صورت روان و ترکیبی بیان کنند.


var circuitBreakerPolicy = Policy
    .Handle<Exception>()
    .CircuitBreakerAsync(
        exceptionsAllowedBeforeBreaking: 3,
        durationOfBreak: TimeSpan.FromSeconds(10),
        onBreak: (exception, timespan) =>
        {
            Console.WriteLine("Circuit Breaker opened: " + exception.Message);
        },
        onReset: () =>
        {
            Console.WriteLine("Circuit Breaker reset.");
        },
        onHalfOpen: () =>
        {
            Console.WriteLine("Circuit Breaker half-opened.");
        });


try
{
    await circuitBreakerPolicy.ExecuteAsync(async () =>
    {
        // Your unreliable operation here
        await MyRemoteService.GetDataAsync();
    });
}
catch (Exception ex)
{
    Console.WriteLine("Handled exception: " + ex.Message);
}

مثال‌های واقعی

الگوی مدارشکن به طور گسترده در صنایع و اپلیکیشن‌های مختلف استفاده می‌شود:

مقایسه الگوی مدارشکن و الگوی تلاش مجدد (Retry)

در حالی که هر دو الگوی مدارشکن و تلاش مجدد برای تحمل خطا استفاده می‌شوند، اهداف متفاوتی را دنبال می‌کنند.

در برخی موارد، این الگوها می‌توانند با هم استفاده شوند. به عنوان مثال، ممکن است یک الگوی تلاش مجدد را در داخل یک مدارشکن پیاده‌سازی کنید. مدارشکن از تلاش‌های مجدد بیش از حد در صورت خرابی مداوم سرویس جلوگیری می‌کند، در حالی که الگوی تلاش مجدد خطاهای گذرا را قبل از فعال شدن مدارشکن مدیریت می‌کند.

ضدالگوهایی که باید از آنها اجتناب کرد

در حالی که مدارشکن یک ابزار قدرتمند است، آگاهی از ضدالگوهای احتمالی مهم است:

مفاهیم پیشرفته

نتیجه‌گیری

الگوی مدارشکن یک ابزار ضروری برای ساخت اپلیکیشن‌های تاب‌آور و مقاوم در برابر خطا است، به ویژه در معماری‌های میکروسرویس و سیستم‌های توزیع‌شده. با جلوگیری از خرابی‌های زنجیره‌ای، کاهش تأخیر و فراهم کردن افت کیفیت کنترل‌شده، پایداری اپلیکیشن را افزایش داده و تجربه کاربری را بهبود می‌بخشد. با در نظر گرفتن دقیق جزئیات پیاده‌سازی و اجتناب از ضدالگوهای رایج، می‌توانید به طور مؤثر از الگوی مدارشکن برای ایجاد سیستم‌های نرم‌افزاری مستحکم‌تر و قابل اطمینان‌تر استفاده کنید. کاربرد جهانی آن، آن را به یک ملاحظه حیاتی برای هر اپلیکیشنی که برای یک پایگاه کاربری متنوع و بین‌المللی طراحی شده است، تبدیل می‌کند. درک و پیاده‌سازی الگوی مدارشکن برای شیوه‌های مهندسی نرم‌افزار مدرن حیاتی است. با پرداختن پیشگیرانه به خرابی‌های بالقوه، توسعه‌دهندگان می‌توانند سیستم‌هایی بسازند که برای مقابله با چالش‌های اجتناب‌ناپذیر محاسبات توزیع‌شده مجهزتر هستند.