go - 如何在入站请求结束后派生可以使用的上下文?
问题描述
从包func (r *Request) Context() context.Context
中的文档net/http
:
对于传入的服务器请求,当客户端的连接关闭、请求被取消(使用 HTTP/2)或 ServeHTTP 方法返回时,上下文将被取消。
如果我想在ServeHTTP
方法返回后完成与请求相关的工作,例如发出通知,正确的做法是什么?我想根据值保留上下文链,但简单地将上述方法最初返回的上下文传递给消息队列提交 API 是行不通的,因为上下文可能在完成之前被取消。
有没有一种简单的方法可以在没有截止日期或取消的情况下仅导出上下文链中的值?我可以手动复制我拥有密钥的值,但其他依赖于上下文连续性的东西(如跟踪)将不存在。
提前感谢您的任何答案。
解决方案
有没有一种简单的方法来得出这些值?
开箱即用,没有。我可以想象有两种可能性:
您可以制作一个自定义上下文,吞下/忽略取消。这种类型需要自定义实现
Done()
andErr()
,它检测到超时/取消,并忽略它。这种方法有一个可能的缺点,即您可能会引用在请求结束时超出范围的值。这可能会导致竞争条件或其他数据完整性问题。
我建议不要使用这种方法,尽管它可能最接近您的要求。上下文应该主要用于取消,因此在上下文中大量使用值是一种反模式。
您在问题中回避的更安全和更容易的解决方案可能是将您仍然关心的任何值显式复制到使用创建的新上下文中
context.Background()
。
推荐阅读
- google-cloud-platform - 无法从 GCP 中的 VM 访问 TPU
- office365 - Google Apps iDP 通过 SAML for Office 365
- mongodb - 无法使用 robo3T 和 C# 从其他服务器连接到 MongoDB 副本集
- python-3.x - 无法使用代码抓取电子邮件?
- php - Facebook og图像即使在重新刮擦后也不会改变
- angular - RxJS 缓存 Http 结果
- windows - 是否可以在 Cordova 下扫描 Windows 10 中的 BLE 设备?
- java - 如何测试是否将正确的 lambda 值作为参数传递(使用 Mockito)?
- matlab - Matlab repelem 的 Eigen 等价物是什么?
- rest - Google、Microsoft、FB 使用什么框架来记录他们的 REST API