Как решать проблемы с ошибками в ряде компонентов системы: Circuit Breaker
Circuit Breaker — это паттерн проектирования для распределенных систем, который предотвращает каскадные сбои, временно блокируя запросы к проблемным компонентам.
Работает по аналогии с автоматическим выключателем в электричестве:
- Closed (нормальная работа): Запросы проходят к сервису.
- Open (обрыв цепи): Если ошибок/таймаутов больше порога, запросы не отправляются, а сразу возвращают ошибку.
- Half-Open (проверка восстановления): Через заданное время пропускает часть запросов, чтобы проверить, восстановился ли сервис.
Как Circuit Breaker помогает в архитектуре ленты?
- Сбойные воркеры:
- Если воркер завис или перегружен (например, при мерже ленты), Circuit Breaker изолирует его, чтобы не блокировать всю систему.
- Пример: Воркер формирования ленты начинает отвечать за 2 секунды вместо 400 мс → Circuit Breaker активируется (то есть переходит в состояние Open), запросы перенаправляются к другим нодам.
- Каскадные сбои:
- Ошибка в одном воркере (например, при запросе к БД) может «заразить» другие компоненты.
- Пример: БД подписок недоступна → Circuit Breaker блокирует запросы к ней, пока она не восстановится, предотвращая лавину таймаутов.
- Ресурсоемкие операции:
- Защита от перегрузки CPU/RAM при мерже ленты для пользователей с 10k подписок.
- Пример: Если воркер тратит 90% CPU на сортировку → Circuit Breaker останавливает новые задачи для него, пока нагрузка не снизится.
Где именно применить Circuit Breaker в нашей архитектуре?
| Компонент | Сценарий применения | Эффект |
| Воркеры мержа ленты | При обработке ленты для пользователей с 10k подписок | Избегает блокировки потоков CPU/RAM |
| Запросы к БД | Если БД подписок отвечает с задержкой >1s | Перенаправляет запросы на реплики БД |
| image-processor | При аварийном завершении сервиса | Останавливает прием новых задач |
Пример реализации для воркеров:
- Настройки Circuit Breaker:
- Порог срабатывания: 50% ошибок за 10 секунд.
- Таймаут в состоянии Open: 30 секунд.
- Квота для Half-Open: 20% запросов.
- Сценарий:
- Воркер №3 обрабатывает мерж ленты 10% пользователей.
- Из-за бага он начинает потреблять 100% CPU → задержка растет до 2s.
- Circuit Breaker фиксирует превышение таймаутов → переводит воркер в Open.
- Запросы перенаправляются к другим воркерам через балансировщик.
- Через 30 секунд Circuit Breaker пропускает 1 запрос для проверки. Если воркер восстановился → Closed, иначе цикл повторяется.
Почему это важно для масштабируемости?
- Предотвращает лавинный крах: Без Circuit Breaker один сбойный компонент может «повалить» всю систему.
- Позволяет точечно масштабировать: Легче добавлять воркеры для проблемных зон (например, подписчиков селебрити).
- Улучшает SLA: Гарантирует, что 99% запросов к ленте будут уложены в 400 мс, даже если часть воркеров не отвечает.