为了账号安全,请及时绑定邮箱和手机立即绑定

如果服务器在客户端的 gRPC 中不可用,等待的方法

如果服务器在客户端的 gRPC 中不可用,等待的方法

Go
守着一只汪 2023-01-03 17:21:59
我希望读这篇文章的人都过得很好。这是我想知道的一个场景:有一个全局 ClientConn 用于对服务器的所有 grpc 请求。然后那个服务器宕机了。我想知道是否有一种方法可以等待此服务器超时,以便在这种情况下使用 grpc 对故障(瞬态故障或服务器停机)更具弹性。我在想,如果 clientConn 状态正在连接或暂时性故障,并且如果在 clientConn 状态是暂时性故障时发生超时,则继续循环,然后返回错误,因为服务器可能已关闭。我想知道如果客户端有多个请求需要这个 ClientConn 那么这是否可行,那么多个 go 例程将运行这个循环。将不胜感激任何其他选择、建议或忠告。
查看完整描述

1 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

当您调用grpc.Dial连接到服务器并收到一个grpc.ClientConn时,它会自动为您处理重新连接。当您调用方法或请求流时,如果无法连接到服务器或处理请求时出错,它将失败。

如果错误表明是网络问题,您可以重试几次。您可以在此处查看 grpc 状态代码https://github.com/grpc/grpc-go/blob/master/codes/codes.go#L31并使用以下方法从返回的错误中提取它们status.FromErrorhttps://pkg.go .dev/google.golang.org/grpc/status#FromError

您还可以grpc.WaitForReady选择 ( https://pkg.go.dev/google.golang.org/grpc#WaitForReady ),如果它处于暂时性故障,可用于阻止 grpc 调用,直到服务器准备就绪。在那种情况下,您不需要重试,但您可能应该添加一个超时来取消上下文以控制您保持阻塞的时间。

如果您甚至想避免尝试调用服务器,您可以使用ClientConn.WaitForStateChange(这是实验性的)来检测任何状态更改并调用ClientConn.GetState以确定连接处于什么状态,以了解何时可以安全地再次开始调用服务器。


查看完整回答
反对 回复 2023-01-03
  • 1 回答
  • 0 关注
  • 233 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信