Карта / Spring Cloud / Circuit Breaker

Circuit Breaker

Circuit Breaker (предохранитель) — защищает систему от каскадного сбоя, когда один упавший сервис не должен утащить за собой всех, кто к нему обращается. Идея — как электрический автомат: при перегрузке цепь размыкается, не давая сгореть всей проводке.

CLOSED запросы идут как обычно 📊 ошибки копятся... слишком много ошибок OPEN сразу fallback без ожидания ⏳ через ~30с... пробует HALF-OPEN проп. часть запросов → CLOSED или OPEN
@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 (ограничение частоты запросов) для полной защиты от перегрузки.

🎤 Закрыл тему, если можешь объяснить:
• идею Circuit Breaker и аналогию с электрическим автоматом;
• три состояния предохранителя и почему без него возможен каскадный сбой (если дошёл до 2-го слоя).