Circuit Breaker

Как решать проблемы с ошибками в ряде компонентов системы: Circuit Breaker

Circuit Breaker — это паттерн проектирования для распределенных систем, который предотвращает каскадные сбои, временно блокируя запросы к проблемным компонентам.

Работает по аналогии с автоматическим выключателем в электричестве:

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