JavaRush /Курсы /Модуль 5. Spring /Лекция 232: Введение в паттерн Circuit Breaker

Лекция 232: Введение в паттерн Circuit Breaker

Модуль 5. Spring
24 уровень , 1 лекция
Открыта

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


Что такое Circuit Breaker?

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

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

Основные задачи паттерна:

  1. Обнаружение ошибок или времени ожидания в зависимостях.
  2. Отключение вызовов к зависимостям, которые проявляют сбои.
  3. Предоставление альтернативного поведения, пока зависимость восстанавливается.
  4. Постепенное возвращение к нормальному состоянию (если связь восстанавливается).

Circuit Breaker был широко популяризирован в среде микросервисов благодаря таким компаниям, как Netflix, которые столкнулись с проблемами цепных отказов. Паттерн положил начало более широкому использованию инструментов, таких как Hystrix (устаревший) и современного Resilience4j.


Принцип работы Circuit Breaker

Основная идея Circuit Breaker заключается в том, чтобы перейти из состояния "Пытайся" в состояние "Не трогай", если с зависимостью что-то не так. Давайте рассмотрим этапы работы:

  1. Closed (Закрытое состояние):
    • Circuit Breaker в обычном рабочем состоянии.
    • Все вызовы проходят к внешним сервисам.
    • Ошибки отслеживаются, и если их количество превышает допустимый порог, переключаемся в "Открытое" состояние.
  2. Open (Открытое состояние):
    • Все вызовы блокируются и получают немедленный отказ.
    • Это состояние предотвращает лавинообразную нагрузку на зависимость.
  3. Half-Open (Полуоткрытое состояние):
    • Через некоторое время Circuit Breaker позволяет несколько вызовов тестирования.
    • Если вызовы успешны — возвращаемся в "Закрытое" состояние.
    • Если снова получаем ошибки — возвращаемся в "Открытое" состояние.

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

  • Выключатель "включён" (Closed) до сбоя.
  • При проблемах (короткое замыкание) он выключается (Open).
  • Через какое-то время вы проверяете его, осторожно включая (Half-Open).

Вот так и работает Circuit Breaker, но вместо электричества у нас — цепочка удалённых вызовов.

Как Circuit Breaker защищает систему:

  • Предотвращает избыточную нагрузку. Вместо того чтобы пытаться тысячу раз подключиться к серверу, который уже "лежит", Circuit Breaker блокирует вызовы.
  • Снижает время простоя. Вы можете заранее настроить Fallback (резервное поведение) для обработки отказа.
  • Защищает пользовательский опыт. Вместо бесконечного ожидания пользователи получают результат (пусть и упрощённый) быстрее.

Когда использовать Circuit Breaker?

Circuit Breaker целесообразно использовать, если:

  1. Вы работаете в распределённой системе (привет, микросервисы).
  2. Ваши вызовы к удалённым сервисам, API или базам данных могут быть ненадёжными.
  3. Вы хотите избежать перегрузки на уровне системы.

Пример: Ваша система делает запросы в API оплаты. Если этот сервис временно недоступен, Circuit Breaker может остановить дальнейшие запросы, снизив нагрузку на API и защитив пользователя от длинного времени ожидания.

Преимущества:

  • Повышение отказоустойчивости. Система продолжает работать в условиях ошибок.
  • Снижение перегрузок. Ограничивает чрезмерные вызовы.
  • Лучшая диагностика. Вы сразу видите, где что-то пошло не так, благодаря понятным состояниям.

Ограничения:

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

Как выглядит реальный пример?

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

Представьте, что у нас есть два микросервиса: Service A и Service B.

  1. Service A делает запросы к Service B через HTTP.
  2. Service B неожиданно сталкивается с ошибкой (например, превышение лимита соединений или сетевой сбой).
  3. Service A с включённым Circuit Breaker понимает, что Service B временно недоступен, и перестаёт отправлять запросы, чтобы не усугублять проблему.
  4. Вместо этого Service A отвечает пользователю заранее подготовленным результатом (Fallback).

Вот схема:


+------------------+      HTTP       +------------------+
|    Service A     |  ----------->  |    Service B     |
|  Запрос данных   |                |  Обработка данных|
|  (Client)        |                |  (Server)        |
+------------------+                +------------------+
        |
        |  (Ошибка в Service B)
        v
+------------------+
|  Circuit Breaker |
|  Блокирует вызовы|
|  для предотвращения |
|  перегрузки      |
+------------------+
        |
        v
+------------------+
|   Fallback      |
|  Отправка       |
|  альтернативных |
|  данных         |
+------------------+

Вопросы для размышления:

  1. Как бы вы описали Circuit Breaker своему другу, который только начал изучать программирование?
  2. Какие риски микросервисная система может устранить с помощью Circuit Breaker?
  3. Как вы считаете, что важнее: правильная настройка Circuit Breaker или автоматическое восстановление зависимостей?

Для тех, кто хочет узнать больше о концепте Circuit Breaker, рекомендую ознакомиться с официальной документацией Resilience4j — это современная библиотека, которая используется для реализации Circuit Breaker в Java-проектах.

В следующей лекции мы займёмся практической реализацией Circuit Breaker в Spring Boot с помощью Resilience4j. Возьмём реальный микросервис, подключим паттерн, настроим параметры, такие как время простоя и количество ошибок до срабатывания, а также протестируем его в действии. Готовьтесь к коду!

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ