Что такое circuit breaker и зачем он нужен?
1️⃣ Как кратко ответить
Circuit breaker — это шаблон проектирования, используемый для предотвращения каскадных отказов в распределенных системах. Он позволяет временно прерывать взаимодействие с неработоспособными сервисами, чтобы избежать перегрузки и дать им время на восстановление.
2️⃣ Подробное объяснение темы
Circuit breaker (переключатель цепи) — это шаблон проектирования, который используется для повышения устойчивости распределенных систем. В системах, где множество сервисов взаимодействуют друг с другом, отказ одного из них может привести к каскадным сбоям, перегрузке и снижению производительности всей системы. Circuit breaker помогает предотвратить такие ситуации.
Как это работает
Circuit breaker работает по аналогии с электрическим предохранителем. Он контролирует взаимодействие между компонентами системы и может находиться в одном из трех состояний:
-
Closed (Закрытое): В этом состоянии все запросы проходят к целевому сервису. Если количество ошибок превышает заданный порог, переключатель переходит в состояние Open.
-
Open (Открытое): В этом состоянии все запросы к целевому сервису блокируются, и сразу возвращается ошибка. Это позволяет избежать перегрузки неработоспособного сервиса. Через определенный интервал времени переключатель переходит в состояние Half-Open.
-
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 — это важный инструмент для обеспечения надежности и устойчивости распределенных систем, позволяющий эффективно управлять отказами и снижать нагрузку на неработоспособные сервисы.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться