> Как подбирать тайм-ауты для backend взаимодействия, например HTTP запросов (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Avito

Стек: Go

> Пример ответа

Подбор тайм-аутов для HTTP-запросов в Go - это баланс между надёжностью и производительностью. Основные принципы:

  1. Используйте контекст (context) с тайм-аутом - это стандартный способ в Go. Например:

    GO
    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()
    req, _ := http.NewRequestWithContext(ctx, "GET", url, nil)
  2. Устанавливайте тайм-аут на уровне клиента - через http.Client.Timeout (общий лимит на весь запрос, включая чтение ответа). Для более тонкого контроля используйте Transport:

    • DialContext - тайм-аут соединения (обычно 1-3 сек)
    • TLSHandshakeTimeout - 2-5 сек
    • ResponseHeaderTimeout - 5-10 сек
    • IdleConnTimeout - для keep-alive (30-90 сек)
  3. Определяйте тайм-ауты на основе SLA:

    • Для критичных внутренних сервисов: 1-3 секунды
    • Для внешних API: 5-10 секунд (с учётом возможных задержек)
    • Для batch-операций: до 30 секунд, но с возможностью отмены
  4. Учитывайте цепочку вызовов: если ваш сервис вызывает другой, тайм-аут должен быть меньше, чем у вызывающего (например, 2 сек против 5 сек), чтобы не накапливать ожидания.

  5. Тестируйте и мониторьте: используйте p99 latency для корректировки. Слишком короткие тайм-ауты вызывают ложные ошибки, слишком длинные - деградацию при сбоях.

Пример настройки:

GO
transport := &http.Transport{
DialContext: (&net.Dialer{Timeout: 2 * time.Second}).DialContext,
TLSHandshakeTimeout: 3 * time.Second,
ResponseHeaderTimeout: 5 * time.Second,
}
client := &http.Client{
Timeout: 10 * time.Second,
Transport: transport,
}

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью