Sobes.tech
Back to questions
Senior
6

Какие механизмы защиты от медленных внешних сервисов существуют? Что такое Circuit Breaker?

Companies where asked
Lenta Tech

Answer from AI

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 помогает сделать систему более устойчивой к сбоям внешних сервисов.