Получить доступ

Как подключить circuit breaker к вызову внешнего сервиса в Spring Boot?

SeniorУстойчивость и наблюдаемостьSpring BootSpring Cloud
Ещё спрашивают так:
  • Как использовать Resilience4j в Spring Boot?
  • Что такое circuit breaker?
Коротко

Resilience4j — библиотека устойчивости для Spring Boot (Hystrix давно в режиме поддержки и из Spring Cloud удалён). Аннотация @CircuitBreaker(name = "payments", fallbackMethod = "...") на методе вызова, пороги — в application.yml.

  • Состояния: CLOSED → OPEN (при доле ошибок или медленных вызовов) → HALF_OPEN (пробные вызовы)
  • Вместе с ним: таймаут клиента, Retry, Bulkhead
  • Состояние и метрики — в Actuator и Micrometer

А ещё Аннотации работают через AOP — те же ограничения прокси (self-invocation)

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Зачем: внешний сервис начал отвечать ошибками или медленно. Без защиты каждый запрос ждёт таймаут, потоки заняты, сервис падает целиком. Circuit breaker после порога ошибок перестаёт вызывать зависимость на время и сразу возвращает запасной ответ.

Подключение: resilience4j-spring-boot3 (или spring-cloud-starter-circuitbreaker-resilience4j) и spring-boot-starter-aop.

@CircuitBreaker(name = "payments", fallbackMethod = "pendingPayment")
public PaymentStatus charge(Order o) { return client.charge(o); }

PaymentStatus pendingPayment(Order o, Throwable e) {
    return PaymentStatus.PENDING;          // принять заказ, оплату проверить позже
}
resilience4j.circuitbreaker.instances.payments:
  sliding-window-size: 50
  minimum-number-of-calls: 20
  failure-rate-threshold: 50
  slow-call-duration-threshold: 2s
  slow-call-rate-threshold: 50
  wait-duration-in-open-state: 30s
  permitted-number-of-calls-in-half-open-state: 5

Что важно:

  • медленные вызовы считаются отдельным порогом — именно они чаще кладут сервис;
  • таймаут у HTTP-клиента обязателен — breaker его не заменяет;
  • порядок аспектов Retry и CircuitBreaker определяет, считаются ли повторы ошибками;
  • fallback должен быть осмысленным: кэш, значение по умолчанию, отложенная обработка — или честная ошибка;
  • состояние — в /actuator/circuitbreakers, плюс алерты.

Что хотят услышать

  • Зачем circuit breaker.
  • Resilience4j, аннотация, fallback, настройки.
  • Медленные вызовы, таймауты, связка с Retry.

Частые ошибки

  • Ставить breaker без таймаута клиента.
  • Называть Hystrix текущим выбором.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Подключить Resilience4j, пометить вызов @CircuitBreaker с fallbackMethod и настроить пороги в application.yml
  • ✗Увеличить таймаут вызова до минуты
  • ✗Использовать Hystrix — он входит в Spring Boot 3
  • ✗Повторять вызов бесконечно до успеха

Что спросят дальше

  • Чем circuit breaker отличается от retry?
  • Что такое bulkhead?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем