В архитектуре микросервисов служба обычно вызывает другие службы для получения данных, и есть вероятность, что вышестоящая служба может быть недоступна. Если проблема вызвана временными сетевыми проблемами или временной недоступностью, служба клиента может повторить запрос несколько раз, чтобы решить проблему.
Однако могут возникнуть и другие серьезные проблемы, такие как сбой базы данных или служба, которая не отвечает быстро. В таких случаях слишком много повторяющихся запросов, которые обречены на неудачу, могут привести к каскадным сбоям во всей системе.
Итак, вот и спасение: автоматический выключатель. Это механизм, который позволяет защитить ваш сервис от выполнения слишком большого количества запросов за короткий период.
В этом посте я покажу вам, как использовать библиотеку 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.