Пакет для работы с Circuit Breaker.
Можно прочитать по ссылке.
Здесь используется бакетный алгоритм. Вставка ошибки занимает O(1), доступность - O(n).
Можно улучшить путём добавления внешней горутины, пересчитывающей доступность брейкера. Тогда проверка доступности брейкера будет занимать О(1).
Содержит интерфейс Barber со следующими методами
Метод | Возвращаемое значение | Описание |
---|---|---|
IsAvailable(int, time.Time) | boolean | Проверяет доступность выбранного сервера в переданный момент времени |
AddError(int, time.Time) | - | Добавляет ошибку для переданного момента времени |
Stats() | pointer Stats | Получает статистику ошибок для всех серверов в Barber |
Параметр | Тип | Описание |
---|---|---|
serverID | integer | ID сервера (или функционала) |
tm | time.Time | Метка времени |
Возвращаемое значение boolean
обозначает доступность сервера (или функционала).
if barber.IsAvailable(42, time.Now()) {
return false, fmt.Errorf("server %d is not available", 42)
}
Параметр | Тип | Описание |
---|---|---|
serverID | integer | ID сервера (или функционала) |
tm | time.Time | Метка времени |
barber.AddError(42, time.Now())
Возвращает указатель на структуру Stats
.
Параметр | Тип | Описание |
---|---|---|
hosts | array integer | ID серверов (или функционалов) |
config | pointer Config | Конфигурация |
Возвращаемое значение Barber
является новым инстансом Barber
.
barber := NewBarber([]int{42, 43, 44}, &Config{})
Параметр | Тип | Описание |
---|---|---|
prefix | string | Префикс, по которому будут найдены параметры в конфигурационном файле |
Возвращаемое значение func() *Config
является Callback
, который необходимо вызвать после успешной инициализации
конфигурации приложения.
cfg := NewConfig("some_prefix")
_ = config.InitOnce() // или app.Init()
brb := NewBarber([]int{42, 43, 44}, cfg())
Поле | Тип | Описание |
---|---|---|
Threshold | integer | Время, после которого обнуляется первая замеченная ошибка |
MaxFails | integer | Максимальное количество ошибок, после которого сервер (или функционал) закрывается CircuitBreaker"ом |
Поле | Тип | Описание |
---|---|---|
ServerID | integer | ID сервера(или функционала) |
FailsCount | integer | Количество ошибок за интервал времени [now - config.threshold; now] |
Поле | Тип | Описание |
---|---|---|
Hosts | array pointer StatsHost | Статистика по всем серверам (или функционалу) |