如何导出入站请求结束后可以使用的上下文?

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

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

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

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

提前感谢任何答案。


慕工程0101907
浏览 104回答 1
1回答

catspeake

是否有一种简单的方法来导出值?开箱即用,没有。我可以想象有两种可能性:您可以创建一个自定义上下文,它会吞噬/忽略取消。这种类型需要自定义实现Done()and Err(),它检测到超时/取消,并忽略它。这种方法有一个可能的缺点,即您可能引用了预期在请求结束时超出范围的值。这可能会导致竞争条件或其他数据完整性问题。我建议不要使用这种方法,尽管它可能最接近您的要求。上下文应该主要用于取消,因此在上下文中大量使用值是一种反模式。您在问题中回避的更安全、更简单的解决方案可能是将您仍然关心的任何值显式复制到使用context.Background().
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go