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()` — он гасит контекст до получения ответа
