Sobes.tech
Назад к вопросам
Senior
6

Паттерны устойчивости при нестабильной сети до внешнего вендора: retry, circuit breaker

Компании, где спрашивали
SelectelSelectel

Ответ от нейросети

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 предотвращает излишние запросы к недоступному сервису.