Паттерны устойчивости при нестабильной сети до внешнего вендора: retry, circuit breaker
Answer from AI
sobes.tech AI
При нестабильной сети до внешнего вендора применяются паттерны устойчивости, такие как retry и circuit breaker, чтобы повысить надёжность и избежать излишней нагрузки.
Retry — повторная попытка выполнить запрос при временных ошибках (например, таймауты или сетевые сбои). Важно реализовать экспоненциальную задержку между попытками и ограничение по количеству повторов, чтобы не создавать дополнительную нагрузку.
Circuit breaker — механизм, который "разрывает цепь" вызовов к внешнему сервису при обнаружении повторяющихся ошибок. Он предотвращает постоянные попытки обращения к недоступному сервису, давая ему время восстановиться. Circuit breaker обычно имеет три состояния:
- Closed (закрыт): запросы проходят.
- Open (открыт): запросы блокируются, сразу возвращается ошибка.
- Half-Open (полуоткрыт): периодически пробуются запросы для проверки доступности.
Пример на Go с использованием библиотеки github.com/sony/gobreaker:
import (
"fmt"
"net/http"
"time"
"github.com/sony/gobreaker"
)
func main() {
cb := gobreaker.NewCircuitBreaker(gobreaker.Settings{
Name: "VendorAPI",
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://vendor.api/resource")
if err != nil {
return nil, err
}
defer resp.Body.Close()
if resp.StatusCode >= 500 {
return nil, fmt.Errorf("server error %d", resp.StatusCode)
}
return resp.Body, nil
})
if err != nil {
fmt.Println("Request failed:", err)
} else {
fmt.Println("Request succeeded", body)
}
}
Таким образом, retry помогает справиться с временными сбоями, а circuit breaker предотвращает излишние запросы к недоступному сервису.