Ответ
Да, применял. Circuit Breaker — это паттерн для повышения отказоустойчивости распределенных систем. Он предотвращает каскадные сбои, временно блокируя вызовы к неработающему сервису и предоставляя fallback-ответ.
Пример реализации на Java с Resilience4j:
import io.github.resilience4j.circuitbreaker.*;
import java.time.Duration;
import java.util.function.Supplier;
// Конфигурация
CircuitBreakerConfig config = CircuitBreakerConfig.custom()
.failureRateThreshold(50) // Порог срабатывания в %
.waitDurationInOpenState(Duration.ofSeconds(5))
.slidingWindowSize(10)
.build();
CircuitBreaker circuitBreaker = CircuitBreaker.of("externalService", config);
// Оборачиваем вызов внешнего сервиса
Supplier<String> decoratedCall = CircuitBreaker
.decorateSupplier(circuitBreaker, this::callUnstableService);
// Выполнение с обработкой сбоя
String result = Try.ofSupplier(decoratedCall)
.recover(throwable -> "Service unavailable. Using cached data.")
.get();
Типичные сценарии использования:
- Вызовы внешних API или микросервисов.
- Обращения к удаленным базам данных или кешам.
- Любые операции, где возможны временные сбои.
Ключевые настройки:
failureRateThreshold— процент ошибок для перехода в состояние Open.waitDurationInOpenState— время в Open перед попыткой Half-Open.slidingWindowSize— количество вызовов для анализа.
Паттерн критически важен для graceful degradation и устойчивости системы.