Как подключить circuit breaker к вызову внешнего сервиса в Spring Boot?
- Как использовать 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)
Подробно
Зачем: внешний сервис начал отвечать ошибками или медленно. Без защиты каждый запрос ждёт таймаут, потоки заняты, сервис падает целиком. 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 текущим выбором.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Использовать Hystrix: он входит в Spring Boot 3 и включается одной аннотацией
- ✓Resilience4j: @CircuitBreaker с fallbackMethod и пороги в application.yml
- ✗Увеличить таймаут вызова до минуты
- ✗Повторять вызов бесконечно до успеха
Что спросят дальше
- Чем circuit breaker отличается от retry?
- Что такое bulkhead?
Разбор темы
- Resilience: таймауты, ретраи и circuit breaker
Защита от каскадных отказов: таймауты, безопасные ретраи, состояния circuit breaker, bulkhead и rate limiter, fallback и порядок паттернов.
Связанные вопросы
- В каких состояниях бывает circuit breaker и как он между ними переходит? Middle
- Внешний платёжный провайдер начал отвечать за 30 секунд вместо 200 миллисекунд. Через минуту сервис перестал отвечать вообще, включая страницы, не связанные с оплатой. Что произошло? Middle
- Что необходимо учесть, добавляя автоматические повторы вызова внешнего сервиса? Middle
- Чем bulkhead отличается от rate limiter? Middle
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.