← Назад ко всем вопросам

Что такое circuit breaker и зачем он нужен?

1️⃣ Как кратко ответить

Circuit breaker — это шаблон проектирования, используемый для предотвращения каскадных отказов в распределенных системах. Он позволяет временно прерывать взаимодействие с неработоспособными сервисами, чтобы избежать перегрузки и дать им время на восстановление.

2️⃣ Подробное объяснение темы

Circuit breaker (переключатель цепи) — это шаблон проектирования, который используется для повышения устойчивости распределенных систем. В системах, где множество сервисов взаимодействуют друг с другом, отказ одного из них может привести к каскадным сбоям, перегрузке и снижению производительности всей системы. Circuit breaker помогает предотвратить такие ситуации.

Как это работает

Circuit breaker работает по аналогии с электрическим предохранителем. Он контролирует взаимодействие между компонентами системы и может находиться в одном из трех состояний:

  1. Closed (Закрытое): В этом состоянии все запросы проходят к целевому сервису. Если количество ошибок превышает заданный порог, переключатель переходит в состояние Open.

  2. Open (Открытое): В этом состоянии все запросы к целевому сервису блокируются, и сразу возвращается ошибка. Это позволяет избежать перегрузки неработоспособного сервиса. Через определенный интервал времени переключатель переходит в состояние Half-Open.

  3. Half-Open (Полуоткрытое): В этом состоянии небольшое количество запросов допускается к целевому сервису для проверки его работоспособности. Если запросы успешны, переключатель возвращается в состояние Closed. Если снова возникают ошибки, переключатель возвращается в состояние Open.

Зачем это нужно

  • Предотвращение каскадных отказов: Circuit breaker предотвращает распространение сбоев от одного сервиса к другим, защищая систему от перегрузки.
  • Улучшение устойчивости: Система становится более устойчивой к временным сбоям, так как не тратит ресурсы на взаимодействие с неработоспособными сервисами.
  • Снижение времени простоя: Circuit breaker позволяет сервисам восстанавливаться без дополнительного давления со стороны входящих запросов.

Пример кода

Рассмотрим пример реализации circuit breaker на языке Java с использованием библиотеки Resilience4j:

import io.github.resilience4j.circuitbreaker.CircuitBreaker;
import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry;
import java.time.Duration;
​
public class CircuitBreakerExample {
​
    public static void main(String[] args) {
        // Создаем конфигурацию для circuit breaker
        CircuitBreakerConfig config = CircuitBreakerConfig.custom()
            .failureRateThreshold(50) // Порог ошибок в процентах
            .waitDurationInOpenState(Duration.ofSeconds(30)) // Время ожидания в открытом состоянии
            .slidingWindowSize(10) // Размер скользящего окна для подсчета ошибок
            .build();
​
        // Регистрируем circuit breaker с заданной конфигурацией
        CircuitBreakerRegistry registry = CircuitBreakerRegistry.of(config);
        CircuitBreaker circuitBreaker = registry.circuitBreaker("myCircuitBreaker");
​
        // Пример использования circuit breaker
        try {
            // Выполняем защищенный вызов
            String result = circuitBreaker.executeSupplier(() -> {
                // Логика вызова удаленного сервиса
                return "Response from service";
            });
            System.out.println(result);
        } catch (Exception e) {
            // Обработка ошибок
            System.out.println("Service is unavailable");
        }
    }
}
  • CircuitBreakerConfig: Создается конфигурация для circuit breaker, где задается порог ошибок, время ожидания в открытом состоянии и размер скользящего окна.
  • CircuitBreakerRegistry: Регистрируется circuit breaker с заданной конфигурацией.
  • executeSupplier: Метод, который выполняет защищенный вызов. Если сервис недоступен, будет выброшено исключение, и запросы будут блокироваться в состоянии Open.

Circuit breaker — это важный инструмент для обеспечения надежности и устойчивости распределенных систем, позволяющий эффективно управлять отказами и снижать нагрузку на неработоспособные сервисы.

Тема: Архитектура и распределённые системы
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки