登录
首页 >  Golang >  Go问答

正确处理 grpc 调用上下文取消的方法是什么?

来源:stackoverflow

时间:2024-03-21 09:33:29 128浏览 收藏

当使用 Gin 处理 REST API 请求时,调用 gRPC 服务的 goroutine 中的上下文可能会被取消。这是因为 Gin 在处理程序返回后会关闭上下文,导致 gRPC 调用失败并显示“context canceled”错误。要解决此问题,可以根据实际需要选择以下方法: * **取消 RPC 调用:**如果在上下文取消时取消 RPC 调用符合预期行为,则可以采用此方法。 * **使用其他上下文:**如果需要触发必须完成的调用,则可以传入 context.Background() 或其他不与请求直接关联的上下文。

问题内容

我正在开发一个 go 应用程序,它使用 gin 来提供其余的 API。 我的 4 个 API 处理程序函数调用一个 goroutine,该 goroutine 进行 gRPC 调用。我看到一件奇怪的事情,对其中一个处理程序的所有 grpc 调用都失败,并显示 context 取消了 ,而其他 3 个处理程序则成功。

查看日志,我注意到我的 API 在 goroutine 执行之前返回。有没有可能 gin 在 API 返回后取消上下文?

上下文通过几个中间调用从处理函数传播到 goroutine。

我看到的错误是 rpc 错误:代码 = 已取消 desc = 上下文已取消

我该如何调试这个? gin 返回响应后是否会取消上下文?


正确答案


docs for Request.Context()(杜松子酒 uses http.Request)说:

所以,是的,当您的处理程序(实际上是 ServeHTTP 方法)返回时,上下文将关闭(请参阅 here)。如果连接由于其他原因(网络问题,甚至您的服务器关闭)而断开,上下文也会被取消。

处理这个问题的正确方法实际上取决于您想要实现的目标:

  • 在许多情况下,正确的行为是在取消上下文时取消 RPC 调用。例如,如果您正在检索完成请求所需的信息,那么取消这些请求可能会节省资源。
  • 如果您要触发必须完成的调用,请传入 context.Background()(或不直接与请求关联的其他上下文)。

看看为什么你的处理程序在所有 RPC 调用完成之前就返回了;如果这就是您想要的,那么您将需要使用不同的上下文(但请记住,这可能意味着当您实际上还不知道整个过程是否会成功时,您将返回 OK 响应代码)。

以上就是《正确处理 grpc 调用上下文取消的方法是什么?》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>