我应该为下游服务调用创建一个新的上下文,还是只是简单地传递上游服务?

时间:2018-06-13 06:20:02

标签: go

过程是这样的:对于每个传入的HTTP请求,我有一个早期的公共处理程序,它将为请求创建上下文,还有一些其他常见的处理程序将执行一些预处理/解析操作然后放一些在未来使用的上下文中的数据,最终将调用一个下游grpc API。

现在我无法理解这一点:

  1. 我只是简单地将早期公共处理程序创建的上下文传递给grpc API调用,关注的是下游API不需要先前放在上下文中的那些数据,所以我打算使用在进行grpc调用之前,WithValue(parent Context, key, val interface{}) Context API将它们全部设置为nil;

  2. 我创建了一个全新的上下文outgoingCtx := metadata.NewOutgoingContext(context.Background(), md),然后在早期的上下文ctx.Done()中,我在此Cancel()上调用了outgoingCtx;

  3. 哪个选项更好,或者即使对于非常高的并发情况,它也没有任何区别?

1 个答案:

答案 0 :(得分:1)

不跨网络边界传输上下文值。这是不可能的,因为在不知道所有键的情况下无法从上下文中获取所有值的列表。

传输的是取消信号。也就是说,如果服务的客户端在RPC完成之前放弃,上游服务也可以停止工作。是否需要这是一个案例决定:您可能不希望在注册完成后取消发送电子邮件,但取消只读操作通常是完全正常的。