При синхронных вызовах к нестабильному внешнему API, если он начинает тормозить или выдавать ошибки, каждый вызов ждёт таймаута (например, 30 секунд). При большом количестве таких запросов все потоки приложения оказываются заняты, и сервис А перестаёт отвечать даже на свои внутренние запросы. Простые ретраи (A) только усугубляют ситуацию, создавая дополнительную нагрузку. Timeout (D) помогает не ждать бесконечно, но не предотвращает повторные вызовы. Bulkhead (B) изолирует ресурсы, но не предотвращает сами вызовы.
Что делает Circuit Breaker:
Паттерн отслеживает ошибки при вызове внешнего сервиса и имеет три состояния:
CLOSED (замкнут) – вызовы идут к внешнему сервису. Счётчик ошибок увеличивается.
OPEN (разомкнут) – при превышении порога ошибок (например, 5 ошибок за 10 секунд) все вызовы мгновенно возвращают fallback-ответ (кэш, сообщение об ошибке) без реального запроса к сервису. Это даёт внешнему сервису время на восстановление.
HALF-OPEN (полуоткрыт) – через заданное время (например, 30 секунд) пропускается один пробный вызов. Если он успешен – предохранитель замыкается (CLOSED), если нет – снова размыкается (OPEN).
Реальный пример:
В Netflix, Hystrix (реализация Circuit Breaker) защищает сервисы от падения зависимостей. Если сервис рекомендаций падает, предохранитель размыкается, и пользователь видит заглушку, а не бесконечную загрузку.
Что должен зафиксировать аналитик:
«Для всех вызовов внешних API должен быть реализован паттерн Circuit Breaker».
«Порог ошибок – 5 за 10 секунд, таймаут открытого состояния – 30 секунд».
«Предусмотреть fallback-стратегию (кэш, сообщение, дефолтное значение)».
Вывод: Circuit Breaker — обязательный паттерн для всех синхронных интеграций, чтобы избежать каскадных отказов и исчерпания ресурсов системы.