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