过程是这样的:对于每个传入的 HTTP 请求,我有一个早期的通用处理程序,它会为请求创建上下文,还有一些其他的通用处理程序会做一些预处理/解析操作,然后把一些上下文中的数据以备将来使用,最终将调用一个下游 grpc API。
现在我无法下定决心:
我只是简单地将早期公共(public)处理程序创建的上下文传递给 grpc API 调用,担心的是下游 API 不需要我之前放入上下文中的那些数据,所以我打算使用
WithValue(parent Context, key, val interface{}) Context
API 在调用 grpc 之前将它们全部设置为nil
;我创建了一个全新的上下文
outgoingCtx := metadata.NewOutgoingContext(context.Background(), md)
,然后在早期上下文ctx.Done()
我在这个outgoingCtx
; 上调用了
Cancel()
哪个选项更好,或者它实际上没有任何区别,即使对于非常高的并发情况也是如此?
最佳答案
上下文值不会跨网络边界传输。这是不可能的,因为在不知道所有键的情况下无法从上下文中获取所有值的列表。
传输的是取消信号。也就是说,如果您的服务的客户端在 RPC 完成之前放弃,则上游服务也可以停止其工作。是否需要这取决于具体情况:您可能不想在注册完成后取消发送电子邮件,但取消只读操作通常完全没问题。
关于go - 我应该为下游服务调用创建一个新上下文还是只是简单地传递上游服务调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50830292/