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

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

Итак, вот и спасение: автоматический выключатель. Это механизм, который позволяет защитить ваш сервис от выполнения слишком большого количества запросов за короткий период.

В этом посте я покажу вам, как использовать библиотеку gobreaker для реализации шаблона прерывателя цепи на реальном примере.

Давайте начнем!

Обзор концепций

Три состояния

Автоматический выключатель имеет три различных состояния: замкнут, разомкнут и полуоткрыт.

  • Закрыто — всем запросам разрешается проходить вышестоящему сервису.
  • Открыть — все запросы не могут пройти к вышестоящей службе.
  • Half-Open — чтобы определить, восстановлена ​​ли вышестоящая служба, прерыватель цепи пропускает только небольшое количество запросов в этом состоянии.

Изменения состояния

  • Close to Open — выключатель находится во включенном состоянии; когда неудачные запросы превышают пороговое значение, автоматический выключатель переходит в открытое состояние.
  • Open to Half-Open — автоматический выключатель находится в разомкнутом состоянии; по истечении определенного периода ожидания автоматический выключатель перейдет в полуоткрытое состояние.
  • Half-Open to Open — автоматический выключатель находится в полуоткрытом состоянии; когда запрос к вышестоящему сервису по-прежнему терпит неудачу, автоматический выключатель снова переходит в открытое состояние.
  • Half-Open to Closed — автоматический выключатель находится в полуоткрытом состоянии; когда определенное количество предопределенных запросов будет успешным, автоматический выключатель перейдет в замкнутое состояние.

Количество запросов

Автоматический выключатель хранит количество запросов и их успехи/неудачи.

type Counts struct {
    Requests             uint32
    TotalSuccesses       uint32
    TotalFailures        uint32
    ConsecutiveSuccesses uint32
    ConsecutiveFailures  uint32
}

Практический пример

Сервер

У нас есть HTTP-сервер, работающий на порту 8080 в качестве восходящей службы в нашем примере. Чтобы имитировать неработоспособность вышестоящей службы, мы возвращаем клиенту код ошибки 500 в течение первых 5 секунд при запуске.

Клиент

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

Основная функция

В функции main мы сначала инициализируем автоматический выключатель с его конфигурацией.

  • Name это имя автоматического выключателя
  • MaxRequests — это максимальное количество запросов, которое может пройти, когда автоматический выключатель находится в полуразомкнутом состоянии.
  • Interval — циклический период замкнутого состояния автоматического выключателя для сброса внутренних счетчиков.
  • Timeout - период разомкнутого состояния, после которого автоматический выключатель переходит в полуразомкнутое состояние.
  • ReadyToTrip вызывается при сбое запроса в закрытом состоянии. Автоматический выключатель перейдет в разомкнутое состояние, если эта функция возвращает значение true.
  • OnStateChange вызывается всякий раз, когда изменяется состояние CircuitBreaker.

Затем мы делаем 100 запросов к восходящему сервису и наблюдаем за изменением состояния прерывателя цепи.

Полный код

Результат Объяснение

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

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

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

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

Заключение

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

Надеюсь, вам понравилось это читать. Если вы хотите поддержать меня как писателя, подумайте о том, чтобы стать членом Medium. Вы также получите неограниченный доступ ко всем историям на Medium.