Выбор ответа Senior context обновлено

context.WithoutCancel

Вопрос

Обработчик HTTP после ответа запускает фоновую запись в аудит с r.Context(), и запись иногда обрывается с context canceled. Что исправит проблему, сохранив значения контекста (trace id)?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: context.WithoutCancel(r.Context()): значения есть, отмены нет. Контекст запроса отменяется, когда обработчик вернулся или клиент ушёл, поэтому фоновая работа с ним обрывается.

Варианты ответа

  1. context.WithoutCancel(r.Context()): значения есть, отмены нетправильный ответ
  2. context.Background(): он не отменяется и наследует значения запроса
  3. context.TODO(): заглушка, которая копирует значения запроса
  4. Увеличить WriteTimeout сервера, чтобы контекст жил дольше

Разбор

Контекст запроса отменяется, когда обработчик вернулся или клиент ушёл, поэтому фоновая работа с ним обрывается. WithoutCancel даёт потомка, который видит значения родителя, но без его отмены и дедлайна, и к нему можно добавить свой таймаут. Background и TODO не отменяются, но теряют trace id и прочие значения. WriteTimeout не влияет на отмену контекста после завершения обработчика.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.