Назад к вопросам
Senior
7
Какие механизмы защиты от медленных внешних сервисов существуют? Что такое Circuit Breaker?
Компании, где спрашивали
Lenta Tech
Ответ от нейросети
sobes.tech AI
Для защиты от медленных внешних сервисов в Go и в целом применяются следующие механизмы:
- Таймауты — ограничение времени ожидания ответа от сервиса.
- Ретрies (повторные попытки) с экспоненциальной задержкой, чтобы не перегружать сервис.
- Circuit Breaker (автоматический выключатель цепи) — паттерн, который предотвращает постоянные обращения к неработающему или медленному сервису.
- Bulkhead (отсекание ресурсов) — изоляция ресурсов для разных сервисов, чтобы сбой одного не повлиял на весь сервис.
Что такое Circuit Breaker?
Circuit Breaker — это паттерн, который отслеживает состояние вызовов к внешнему сервису и при обнаружении большого количества ошибок или таймаутов «размыкает цепь», то есть временно блокирует дальнейшие вызовы к этому сервису. Это позволяет:
- Избежать излишней нагрузки на неработающий сервис.
- Быстрее возвращать ошибку клиенту, не тратя время на ожидание.
- Позволяет сервису восстановиться, после чего Circuit Breaker автоматически «замыкает цепь» и возобновляет вызовы.
Пример использования Circuit Breaker в Go можно реализовать с помощью библиотек, например, github.com/sony/gobreaker:
import (
"fmt"
"net/http"
"time"
"github.com/sony/gobreaker"
)
func main() {
cb := gobreaker.NewCircuitBreaker(gobreaker.Settings{
Name: "HTTP GET",
MaxRequests: 3,
Interval: 60 * time.Second,
Timeout: 30 * time.Second,
ReadyToTrip: func(counts gobreaker.Counts) bool {
return counts.ConsecutiveFailures > 5
},
})
body, err := cb.Execute(func() (interface{}, error) {
resp, err := http.Get("https://example.com/api")
if err != nil {
return nil, err
}
defer resp.Body.Close()
return "success", nil
})
if err != nil {
fmt.Println("Request failed or circuit open:", err)
} else {
fmt.Println("Request succeeded:", body)
}
}
Таким образом, Circuit Breaker помогает сделать систему более устойчивой к сбоям внешних сервисов.