我希望读这篇文章的人都过得很好。这是我想知道的一个场景:有一个全局 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.FromError
:https://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
以确定连接处于什么状态,以了解何时可以安全地再次开始调用服务器。
- 1 回答
- 0 关注
- 233 浏览
添加回答
举报
0/150
提交
取消