首页 > 解决方案 > 如何在入站请求结束后派生可以使用的上下文?

问题描述

从包func (r *Request) Context() context.Context中的文档net/http

对于传入的服务器请求,当客户端的连接关闭、请求被取消(使用 HTTP/2)或 ServeHTTP 方法返回时,上下文将被取消。

如果我想在ServeHTTP方法返回后完成与请求相关的工作,例如发出通知,正确的做法是什么?我想根据值保留上下文链,但简单地将上述方法最初返回的上下文传递给消息队列提交 API 是行不通的,因为上下文可能在完成之前被取消。

有没有一种简单的方法可以在没有截止日期或取消的情况下仅导出上下文链中的值?我可以手动复制我拥有密钥的值,但其他依赖于上下文连续性的东西(如跟踪)将不存在。

提前感谢您的任何答案。

标签: go

解决方案


有没有一种简单的方法来得出这些值?

开箱即用,没有。我可以想象有两种可能性:

  1. 您可以制作一个自定义上下文,吞下/忽略取消。这种类型需要自定义实现Done()and Err(),它检测到超时/取消,并忽略它。

    这种方法有一个可能的缺点,即您可能会引用在请求结束时超出范围的值。这可能会导致竞争条件或其他数据完整性问题。

    我建议不要使用这种方法,尽管它可能最接近您的要求。上下文应该主要用于取消,因此在上下文中大量使用值是一种反模式。

  2. 您在问题中回避的更安全和更容易的解决方案可能是将您仍然关心的任何值显式复制到使用创建的新上下文中context.Background()


推荐阅读