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

标签 go

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

现在我无法下定决心:

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

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

  3. 上调用了 Cancel()

哪个选项更好,或者它实际上没有任何区别,即使对于非常高的并发情况也是如此?

最佳答案

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

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

关于go - 我应该为下游服务调用创建一个新上下文还是只是简单地传递上游服务调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50830292/

相关文章:

go - Go中关于 `slice`和 `append`的问题

go - 如何附加到结构内的所有字符串值?

docker - 为多个go.mod项目编写dockerfile

pointers - 指针的 slice ,当传递给对象时,得到具有其他地址的指针

go - 比较 2 个 slice 以查看哪个元素已被删除的惯用方法

json - 如何通过遍历 JSON 在 golang 中显示丢失的键?

go - slice 自动排序?

go - NATS JetStream : Is it possible to explicitly ask from JetStream to (re)send the last few messages it received in subject foo. *?

pointers - 如何在 Go 中强制将参数作为指针传递?

json:不支持的类型:func()