Контролируй внешние вызовы в Go через контекст с таймаутом

Практические лайфхаки для разработчиков, DevOps и админов: Docker, Linux, Bash, Python, Golang, Ansible, логи и безопасность — только рабочие решения. Даем готовые команды, конфиги и приёмы диагностики, которые экономят часы и дни. Если нужно быстро настроить, отладить и обезопасить инфраструктуру — вы по адресу.

gocontextтаймаут

👁 Один из частых антипаттернов — зависание приложения из-за зависшего запроса к API или БД. В Go это легко решается с помощью context.WithTimeout, чтобы оборвать долгий вызов и не держать ресурсы.

📝 Пример кода:

ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()

req, _ := http.NewRequestWithContext(ctx, "GET", "https://example.com", nil)
resp, err := http.DefaultClient.Do(req)

if err != nil {
  log.Fatal("request failed:", err)
}
defer resp.Body.Close()

📌 Что происходит:

  • Создаётся контекст с таймаутом 2 секунды
  • Запрос отменится, если не выполнится вовремя
  • cancel() вызывается через defer, чтобы не оставлять ресурсы
  • Работает не только с HTTP, но и с базами, брокерами, gRPC

🔎 Если контекст важен в глубоко вложенной логике, его стоит прокидывать по стеку вызовов. Это даёт гибкий контроль — можно отменить всю цепочку операций, если пользователь отменил запрос или вышел за лимит времени.

❗️ Такой подход особенно важен в микросервисной архитектуре, где нужно контролировать каждый вызов и избегать каскадных фейлов из-за зависших соединений. Рабочее решение, которое должно быть в любом продакшен-коде.

tags: #go #разработка #полезно

❤️ @recura_tech

Тёмный скриншот примера кода на Go: показан вызов context.WithTimeout и отправка HTTP‑запроса; фрагмент кода на тёмном фоне и логотип RECURA внизу.
Пример кода Go: context.WithTimeout для отмены HTTP-запросов

Читайте так же