Применяли ли вы паттерн Circuit Breaker?

«Применяли ли вы паттерн Circuit Breaker?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, применял. 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 или микросервисов.
  • Обращения к удаленным базам данных или кешам.
  • Любые операции, где возможны временные сбои.

Ключевые настройки:

  1. failureRateThreshold — процент ошибок для перехода в состояние Open.
  2. waitDurationInOpenState — время в Open перед попыткой Half-Open.
  3. slidingWindowSize — количество вызовов для анализа.

Паттерн критически важен для graceful degradation и устойчивости системы.