Вступить в клуб →
средняявопросКонкурентность: горутины, каналы, context

HTTP-хендлер строит контекст от Background вместо контекста запроса

В хендлере, который ходит в соседний сервис по gRPC, написано так:

func (h *Handler) GetOrder(w http.ResponseWriter, r *http.Request) {
    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()

    order, err := h.billing.FetchOrder(ctx, orderID(r))
    // ...
}

Во время всплеска нагрузки клиенты отваливаются по своему таймауту в 1 секунду, но нагрузка на биллинг не падает. Что не так в коде?

  • Ничего: `context.Background()` надёжнее, потому что не отменится раньше времени
  • Контекст оторван от `r.Context()`, поэтому разрыв соединения клиентом не отменяет запрос в биллинг
  • Таймаут вообще не сработает: `WithTimeout` от `Background` не запускает таймер
  • Лишний `defer cancel()` — он гасит контекст до получения ответа

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела