Circuit Breaker
Circuit Breaker (предохранитель) — защищает систему от каскадного сбоя, когда один упавший сервис не должен утащить за собой всех, кто к нему обращается. Идея — как электрический автомат: при перегрузке цепь размыкается, не давая сгореть всей проводке.
@CircuitBreaker(name = "userService", fallbackMethod = "getUserFallback")
User getUser(Long id) {
return restTemplate.getForObject("http://user-service/api/users/" + id, User.class);
}
User getUserFallback(Long id, Exception e) {
return new User(id, "Неизвестный пользователь"); // запасной вариант, если сервис недоступен
}
Копнуть глубже
Три состояния предохранителя:
| Состояние | Поведение |
|---|---|
| Closed (закрыт) | запросы идут нормально, как обычно |
| Open (открыт) | после серии ошибок — запросы сразу падают на fallback, не дожидаясь реального таймаута сервиса |
| Half-Open (полуоткрыт) | спустя время пробует пропустить несколько запросов — если успешно, возвращается в Closed |
Почему это критично без Circuit Breaker. Без предохранителя, если user-service упал или сильно тормозит, каждый запрос к нему ждёт таймаут (например, 30 секунд) перед тем, как вернуть ошибку. Если много запросов одновременно ждут этот таймаут, они занимают потоки/соединения вызывающего сервиса, и он тоже падает от исчерпания ресурсов — хотя сам по себе был полностью исправен. Это и есть каскадный сбой, когда падение одного сервиса роняет всю систему по цепочке.
Resilience4j — современная библиотека для реализации Circuit Breaker в Spring (заменила устаревший Hystrix), часто комбинируется с retry (повторные попытки) и rate limiter (ограничение частоты запросов) для полной защиты от перегрузки.
• три состояния предохранителя и почему без него возможен каскадный сбой (если дошёл до 2-го слоя).