Что такое Circuit Breaker и зачем он нужен
1️⃣ Как кратко ответить
Circuit Breaker — это шаблон проектирования, используемый для предотвращения каскадных отказов в распределенных системах. Он позволяет системе временно прекратить попытки выполнения неудачных операций, чтобы избежать перегрузки и дать время на восстановление.
2️⃣ Подробное объяснение темы
Circuit Breaker (переключатель цепи) — это шаблон проектирования, который используется для повышения устойчивости распределенных систем. Он помогает управлять отказами и предотвращать их распространение по всей системе. Этот шаблон особенно полезен в микросервисной архитектуре, где один сервис может зависеть от множества других.
Зачем нужен Circuit Breaker
В распределенных системах сервисы часто взаимодействуют друг с другом через сеть. Если один из сервисов начинает работать неправильно или становится недоступным, это может привести к каскадным отказам, когда другие сервисы, зависящие от него, также начинают испытывать проблемы. Circuit Breaker помогает предотвратить такие ситуации, временно блокируя вызовы к проблемному сервису и давая ему время на восстановление.
Как работает Circuit Breaker
Circuit Breaker работает по аналогии с электрическим предохранителем. Он имеет три состояния:
-
Closed (Закрытое): В этом состоянии все вызовы проходят к целевому сервису. Если количество ошибок превышает заданный порог, Circuit Breaker переходит в состояние Open.
-
Open (Открытое): В этом состоянии вызовы к целевому сервису блокируются, и сразу возвращается ошибка. Это позволяет избежать перегрузки сервиса, который и так не работает должным образом. Через определенный интервал времени Circuit Breaker переходит в состояние Half-Open.
-
Half-Open (Полуоткрытое): В этом состоянии Circuit Breaker позволяет выполнить ограниченное количество вызовов к целевому сервису. Если эти вызовы успешны, Circuit Breaker возвращается в состояние Closed. Если же они продолжают завершаться ошибками, он снова переходит в состояние Open.
Пример использования Circuit Breaker
Рассмотрим пример на Java с использованием библиотеки Resilience4j, которая предоставляет реализацию Circuit Breaker.
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 callRemoteService();
});
System.out.println("Result: " + result);
} catch (Exception e) {
System.out.println("Service call failed: " + e.getMessage());
}
}
private static String callRemoteService() {
// Имитация вызова удаленного сервиса, который может завершиться ошибкой
throw new RuntimeException("Service not available");
}
}
- CircuitBreakerConfig: Создаем конфигурацию для Circuit Breaker, где задаем порог отказов, время ожидания в открытом состоянии и размер скользящего окна.
- CircuitBreakerRegistry: Регистрируем Circuit Breaker с заданной конфигурацией.
- executeSupplier: Используем Circuit Breaker для выполнения вызова к удаленному сервису. Если вызов завершится ошибкой, Circuit Breaker может перейти в состояние Open.
Circuit Breaker помогает улучшить устойчивость системы, предотвращая каскадные отказы и обеспечивая более стабильную работу в условиях сбоев.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться