Масштабирование и надёжность

5 мин чтения

Circuit Breaker: почему иногда системе полезнее отказаться от запроса, чем продолжать пытаться

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

Представим, что сервис оплаты перестал отвечать. Первый запрос ждёт. Второй тоже. Потом таких запросов становится сотни. Потоки заняты, очереди растут, пользователи повторяют действия, а остальные части системы начинают ждать тот же недоступный сервис.

Проблема уже не только в оплате. Одна неисправность начинает тянуть за собой всё приложение.

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

Какую проблему мы решаем

Circuit Breaker отслеживает ошибки при обращении к внешнему сервису или другому компоненту. Когда ошибок становится слишком много, он «размыкает цепь» и временно прекращает обычные вызовы.

Вместо долгого ожидания система может быстро вернуть контролируемую ошибку, использовать запасной сценарий или сообщить пользователю, что функция временно недоступна.

Через некоторое время Circuit Breaker пробует обратиться к зависимости снова. Если она восстановилась, обычная работа продолжается.

Что получает бизнес

Главная бизнес-выгода — ограничение масштаба аварии.

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

Это особенно важно там, где у бизнеса много интеграций. Падение одного поставщика, банка, внешнего API или внутреннего сервиса не должно автоматически останавливать всё остальное.

Есть и второй эффект: восстановление часто проходит быстрее. Чем меньше компонентов успело перегрузиться вслед за первоначальной проблемой, тем меньше потом приходится поднимать и разбирать.

По сути, бизнес платит за возможность сказать: «эта функция сейчас не работает, но компания продолжает работать».

Что получает команда

Команда получает предсказуемое поведение при отказах зависимостей. Вместо бесконечных таймаутов и накопления запросов появляется явное состояние: зависимость временно считается недоступной.

Это упрощает защиту ресурсов и помогает строить fallback-сценарии: взять данные из кэша, отложить операцию, поставить её в очередь или вернуть понятную ошибку.

Но Circuit Breaker не лечит причину сбоя. Он только не даёт проблеме распространяться дальше.

Что получает клиент

Клиент получает меньше «вечного ожидания» и больше понятного поведения.

Иногда быстрый отказ лучше, чем кнопка, которая крутится сорок секунд, а потом всё равно сообщает об ошибке. Ещё лучше, если часть продукта продолжает работать, пока недоступна только конкретная функция.

Для клиента хорошая отказоустойчивость часто выглядит не как отсутствие проблем, а как отсутствие хаоса вокруг проблемы.

Чем мы за это платим

Цена — новые состояния и новые решения, которые нужно правильно настроить.

Когда именно считать сервис сломанным? Сколько ошибок достаточно? Как долго держать цепь разомкнутой? Что делать в это время? Если пороги выбраны плохо, Circuit Breaker может либо слишком поздно защищать систему, либо отключать работающую зависимость раньше времени.

Появляется и продуктовая ответственность: для каждого важного сценария нужно решить, какой fallback допустим. Можно ли показать старые данные? Можно ли принять заказ без мгновенной оплаты? Можно ли отложить операцию?

Это уже не просто настройка библиотеки. Это договорённость между архитектурой и бизнес-процессом.

Когда Circuit Breaker не нужен

Если приложение простое, зависимостей мало, а отказ одной из них не создаёт цепной нагрузки, дополнительный механизм может только усложнить код.

Не каждый вызов нужно оборачивать в Circuit Breaker. Иногда достаточно нормальных таймаутов, ограниченного количества повторов и понятной обработки ошибок.

Что стоит спросить перед решением

В итоге

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

Для бизнеса его ценность не в самом механизме. Она в том, что локальная проблема остаётся локальной, а не превращается в остановку всего продукта.