Как получить контекст, который можно использовать после завершения входящего запроса? - PullRequest
0 голосов
/ 13 ноября 2018

Из документации func (r *Request) Context() context.Context в упаковке net/http:

Для входящих запросов к серверу контекст отменяется, когда закрывается соединение клиента, запрос отменяется (с HTTP / 2) или когда возвращается метод ServeHTTP.

Как правильно поступить, если я хочу завершить работу, связанную с запросом, после возвращения метода ServeHTTP, например, отправку уведомлений? Я хотел бы сохранить цепочку контекста в терминах значений, но простая передача контекста, первоначально возвращенного вышеуказанным методом, в API отправки очереди сообщений не работает, так как контекст может быть отменен до его завершения.

Есть ли простой способ получить только значения в цепочке контекста без крайнего срока или отмены? Я могу вручную скопировать значения, для которых у меня есть ключи, но другие вещи, которые зависят от непрерывности контекста, например, трассировка, будут отсутствовать.

Заранее спасибо за любые ответы.

1 Ответ

0 голосов
/ 13 ноября 2018

Есть ли простой способ получить только значения?

Из коробки нет.Я могу представить себе две возможности:

  1. Вы можете создать собственный контекст, который глотает / игнорирует отмены.Для такого типа потребуется пользовательская реализация Done() и Err(), которая обнаружила тайм-аут / отмену и проигнорировала его.

    У этого подхода есть возможный недостаток: вы можете ссылаться на ожидаемые значениявыйти из области видимости в конце запроса.Это может привести к состязанию или другим проблемам с целостностью данных.

    Я бы посоветовал не использовать этот метод, хотя он, вероятно, наиболее близок к тому, что вы запрашиваете.Контексты следует использовать в первую очередь для отмены, поэтому интенсивное использование значений в контексте является анти-паттерном.

  2. Вероятно, более безопасное и простое решение, которое вы исключили бы из своего вопроса, было быявно скопировать любые значения, которые вам все еще нужны, в новый контекст, созданный с помощью context.Background().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...