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

Go 我应该为下游服务调用创建一个新的上下文,还是仅仅传递上游服务调用?,go,Go,这个过程是这样的:对于每个传入的HTTP请求,我有一个早期的公共处理程序,它将为请求创建上下文,还有一些其他的公共处理程序,它将执行一些预处理/解析操作,然后将一些数据放在上下文中以备将来使用,最终将调用一个下游grpc API 现在我无法决定: 我只是简单地将早期公共处理程序创建的上下文传递给grpc API调用,问题是下游API不需要我之前放入上下文中的那些数据,因此我计划在进行grpc调用之前使用WithValue(父上下文、键、val接口{})上下文API将它们全部设置为nil 我创建了

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

现在我无法决定:

  • 我只是简单地将早期公共处理程序创建的上下文传递给grpc API调用,问题是下游API不需要我之前放入上下文中的那些数据,因此我计划在进行grpc调用之前使用
    WithValue(父上下文、键、val接口{})上下文
    API将它们全部设置为
    nil

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


  • 哪一个选项更好,或者即使对于非常高的并发性情况,也不会产生任何影响?

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


    传输的是取消信号。也就是说,如果服务的客户端在RPC完成之前放弃,则上游服务也可以停止其工作。是否需要这样做取决于具体情况:您可能不想在注册完成后取消发送电子邮件,但通常取消只读操作完全没有问题。

    哦,我明白了,所以我在上下文中设置的那些值实际上根本不重要,我只需简单地将上游上下文传递到下游MBTW,在那里我可以找到任何指示上下文值不会跨网络边界传输的文档,或者任何示例来验证这一点?@Inshi:一个更有效的问题是“为什么您会假设值会被传输?”您将找不到所有未完成的文档(例如,“在哪里可以找到上下文包未清理厕所的文档?”)。您只能找到支持的东西的文档。为什么要在中间件中创建上下文?http包已经为您的每个请求创建了一个上下文。@Flimzy,所以我只需使用
    func(r*request)context()context.context
    API即可获取和使用?除非您有特定的理由不这样做(即您特别不希望在请求终止时取消您的上下文),是的。@Flimzy明白了,非常感谢您