
Circuit breaker на Go: пишем свой за 100 строк и разбираем, почему gobreaker работает иначе
badcasedaily1 16 минут назад Circuit breaker на Go: пишем свой за 100 строк и разбираем, почему gobreaker работает иначе Уровень сложности Средний Время на прочтение 5 мин Охват и читатели 284 Блог компании OTUS Go *...
Anthropic — What company has the best second artificial intelligence model at the end of June?
В сфере искусственного интеллекта произошло заметное событие. badcasedaily1 16 минут назад Circuit breaker на Go: пишем свой за 100 строк и разбираем, почему gobreaker работает иначе Уровень сложности Средний Время на прочтение 5 мин Охват и читатели 284 Блог компании OTUS Go * Программирование * Высоконагруженные системы * Туториал Когда сервис, от которого вы зависите, начинает отвечать по 10 секунд вместо 50 миллисекунд, ваш сервис тоже начинает отвечать по 10 секунд. Горутины висят в ожидании, пул соединений забивается, таймауты каскадируются вверх. С Circuit breaker если количество ошибок превысило порог, он перестаёт отправлять запросы к сбойному сервису.
Вместо ожидания таймаута вызывающий код получает ошибку мгновенно. Через какое‑то время breaker пробует один запрос: прошёл — цепь замыкается, нет — ждём дальше. Напишем свой за 100 строк, а потом сравним с gobreaker от Sony .
Технические детали
Три состояния Closed : нормальная работа, все запросы проходят, breaker считает ошибки. Если количество ошибок за период превысило порог, переход в Open. Open : все запросы отклоняются мгновенно.
После таймаута переход в Half‑Open. Half‑Open : breaker пропускает один запрос. Успешен, переход в Closed.
Реализация package breaker import ( "errors" "sync" "time" ) var ErrCircuitOpen = errors. New("circuit breaker is open") type State int const ( Closed State = iota Open HalfOpen ) type CircuitBreaker struct { mu sync. Mutex state State failures int successes int threshold int timeout time.
Отраслевые последствия
Duration halfOpenMax int lastFailure time. Time } func New(threshold int, timeout time. Duration) *CircuitBreaker { return &CircuitBreaker{ state: Closed, threshold: threshold, timeout: timeout, halfOpenMax: 1, } } func (cb *CircuitBreaker) Execute(fn func() error) error { cb.
currentState() if state == Open { cb. Unlock() return ErrCircuitOpen } cb. Unlock() err := fn() cb.
onFailure() return err } cb. onSuccess() return nil } func (cb *CircuitBreaker) currentState() State { if cb. state == Open && time.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





