Шаблон переборки против автоматического выключателя: сравнение стратегий устойчивости при разработке программного обеспечения

В мире разработки программного обеспечения создание отказоустойчивых и высокодоступных систем имеет первостепенное значение. Двумя популярными стратегиями достижения устойчивости являются схема переборки и автоматический выключатель. Оба шаблона направлены на изоляцию и обработку сбоев в распределенных системах, но они различаются подходом. В этой статье мы подробно рассмотрим эти шаблоны и предоставим примеры кода, иллюстрирующие их реализацию. Давайте погрузимся!

  1. Шаблон переборок:
    Шаблон переборок назван в честь концепции переборок на кораблях, которые делят корабль на отдельные водонепроницаемые отсеки, чтобы предотвратить затопление всего корабля в случае прорыва. При разработке программного обеспечения шаблон Bulkhead применяется путем разделения компонентов системы на отдельные пулы, каждый из которых имеет свои собственные ресурсы и ограничения. Такая изоляция предотвращает влияние сбоев в одном компоненте на всю систему.

Пример:

ExecutorService threadPool = Executors.newFixedThreadPool(10);
ThreadPoolExecutor bulkheadExecutor = new ThreadPoolExecutor(5, 5, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(10));
bulkheadExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// Execute task within the bulkhead
bulkheadExecutor.execute(() -> {
    // Perform the task
});
  1. Автоматический выключатель:
    Шаблон автоматического выключателя вдохновлен электрическими автоматическими выключателями, которые защищают электрические цепи от повреждений, вызванных чрезмерным током. В программных системах шаблон «Выключатель» направлен на предотвращение каскадных сбоев, обеспечивая механизм быстрого отказа. Он контролирует доступность службы и размыкает канал в случае сбоя службы, перенаправляя запросы на резервный механизм.

Пример:

CircuitBreaker circuitBreaker = CircuitBreaker.create()
    .maximumFailures(3)
    .waitDurationInOpenState(Duration.ofSeconds(10))
    .build();
try {
    circuitBreaker.run(() -> {
        // Call the remote service
    });
} catch (CircuitBreakerOpenException ex) {
    // Fallback logic
}
  1. Шаблон повтора:
    Хотя шаблон повтора прямо не упоминается в вопросе, его стоит рассмотреть в контексте устойчивости. Он позволяет автоматически повторять неудачные операции, что может быть полезно в сценариях, где ожидаются временные сбои.

Пример:

RetryConfig config = RetryConfig.custom()
    .maxAttempts(3)
    .waitDuration(Duration.ofMillis(500))
    .retryOnResult(response -> response.getStatus() >= 500)
    .build();
RetryRegistry registry = RetryRegistry.of(config);
Retry retry = registry.retry("my-retry");
Supplier<Response> operation = () -> {
    // Perform the operation
};
Response response = retry.executeSupplier(operation);

В этой статье мы обсудили шаблон «Переборка», шаблон «Выключатель» и шаблон повтора как стратегии достижения устойчивости при разработке программного обеспечения. Каждый шаблон предлагает уникальные преимущества, и его следует выбирать с учетом конкретных требований системы. Реализуя эти шаблоны, разработчики могут создавать устойчивые и надежные системы, способные корректно обрабатывать сбои.