> Что происходит с внешним сервисом при повторных обращениях во время сбоя (Go)
Уровень: senior · Роль: backend · Категория: Технические вопросы
Компании: Wildberries
Стек: Go
> Пример ответа
При повторных обращениях к внешнему сервису во время сбоя возможны три сценария:
-
Каскадный отказ (Cascading failure) - если клиент не ограничивает количество запросов, сервис может быть перегружен, что усугубит сбой. Например, при таймаутах в Go горутины будут накапливаться, потребляя память.
-
Retry storm (шторм повторных запросов) - множество клиентов одновременно повторяют запросы, создавая лавину трафика. Это может привести к отказу даже после восстановления сервиса.
-
Идемпотентность и состояние - если внешний сервис не идемпотентен, повторные запросы могут создать дубликаты данных или нарушить бизнес-логику.
Рекомендации для Go:
-
Используйте circuit breaker (например,
github.com/sony/gobreaker) для быстрого отказа при превышении порога ошибок. -
Применяйте retry с exponential backoff + jitter (например,
github.com/cenkalti/backoff), чтобы избежать синхронных повторных запросов. -
Ограничьте количество одновременных запросов через rate limiter (например,
golang.org/x/time/rate). -
Для критичных операций реализуйте graceful degradation - возвращайте закэшированные данные или fallback-ответ.
Пример кода с circuit breaker и retry:
GOimport ("github.com/sony/gobreaker""github.com/cenkalti/backoff/v4")func callExternalService(ctx context.Context) (string, error) {cb := gobreaker.NewCircuitBreaker(gobreaker.Settings{Name: "external-svc",MaxRequests: 3,Interval: 60 * time.Second,Timeout: 30 * time.Second,})var result stringoperation := func() error {var err errorresult, err = externalAPI.Call(ctx)return err}err := cb.Execute(func() error {return backoff.Retry(operation, backoff.NewExponentialBackOff())})return result, err}
Такой подход минимизирует нагрузку на внешний сервис и предотвращает каскадные отказы.
> Похожие задачи по backend
Как реализовать паттерн fan-out fan-in в Go с использованием горутин?
Что такое селективность индекса и почему не всегда индекс используется?
Как происходит обмен сертификатами в HTTPS
Имеет ли смысл передавать слайс по указателю в Go
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью