Circuit Breaker (автоматический выключатель) — это способ защитить систему от цепной реакции сбоев. Его задача проста: если какой-то сервис уже явно работает плохо или не работает вовсе, нет смысла продолжать к нему стучаться и усугублять ситуацию. Лучше вовремя остановиться и дать ему восстановиться.
Проще всего это понять через аналогию с электричеством. В обычной сети автомат выбивает, если ток становится слишком большим — чтобы провода не перегрелись и ничего не загорелось. Пока цепь разомкнута, ток не идет. Через какое-то время можно попробовать включить обратно: если проблема исчезла, все снова работает нормально.
В софте идея та же:
- Closed (замкнут): запросы к удаленному сервису выполняются в обычном режиме, при этом отслеживается количество ошибок (таймауты, отказы, 5xx).
- Open (разомкнут): при превышении порога ошибок выключатель размыкается, все последующие запросы немедленно завершаются ошибкой без попытки вызова. Это дает сервису время восстановиться и предотвращает исчерпание ресурсов в вызывающем сервисе.
- Half-Open (полуоткрыт): через заданный таймаут пропускается ограниченное количество пробных запросов. Если они успешны — состояние возвращается в Closed, если нет — снова в Open.
В микросервисах это особенно критично. Один упавший сервис легко может потянуть за собой остальные. Без какой-либо защиты начинается неприятный сценарий: сервисы продолжают ждать ответы, занимают потоки и соединения, ресурсы заканчиваются, и в итоге даже те части системы, которые были здоровы, перестают нормально работать.
Circuit Breaker ломает этот сценарий. Он позволяет «падать быстро» — не зависать в ожидании, а сразу отдавать ошибку. За счет этого экономятся ресурсы, а проблемный сервис получает передышку. И при этом все происходит автоматически: система сама проверяет, когда можно вернуться к нормальной работе.
Конечно, в реальности все чуть тоньше. Нужно аккуратно настроить, сколько ошибок считать критичными и за какой промежуток времени, как долго держать выключатель в «разомкнутом» состоянии и сколько пробных запросов пускать при проверке. Важно и то, как это сочетается с таймаутами и повторными попытками: обычно сначала срабатывает таймаут, потом возможен retry, и уже при накоплении ошибок включается Circuit Breaker.
В итоге это не просто способ «подавить ошибки», а полноценный механизм защиты. Он помогает системе не развалиться из-за одного проблемного звена и переводит взаимодействие с нестабильными сервисами в более безопасный режим, где есть место и для ожидания, и для восстановления.