我希望读过这篇文章的人都做得很好.

这里有一个我想知道的场景:有一个全局ClientConn,用于对服务器的所有grpc请求.然后服务器停机.我想知道是否有一种方法可以等待此服务器超时,以便在此场景中使用grpc对故障(瞬时故障或服务器停机)更具弹性.我在想,如果clientConn状态为连接或瞬时故障,则保持循环,如果在clientConn状态为瞬时故障时发生超时,则返回错误,因为服务器可能已关闭.

我想知道如果客户端中有多个请求需要这个ClientConn,那么多个go routine 将运行这个循环,这是否可行.如有其他 Select 、建议或建议,将不胜感激.

推荐答案

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

如果错误表明是网络造成的,您可以重试几次.您可以在这里判断https://github.com/grpc/grpc-go/blob/master/codes/codes.go#L31中的grpc状态代码,并使用status.FromError:https://pkg.go.dev/google.golang.org/grpc/status#FromError从返回的错误中提取它们

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

如果您甚至不想try 调用服务器,可以使用ClientConn.WaitForStateChange(这是实验性的)来检测任何状态变化,并调用ClientConn.GetState来确定连接处于何种状态,以确定何时可以安全地再次开始调用服务器.

Go相关问答推荐

Go 1.22 net/http群组路由

Golang html/模板&需要错误数量的参数1在模板中使用';调用';获得0&q;

使用一元或服务器流将切片从GRPC服务器返回到客户端

如何在S汇编器中更高效地将全局数据加载到霓虹灯寄存器?

使用!NOT运算符的Golang文本/模板多个条件

一次打印用户输入的字符串n次

如何在出现错误时停止从通道读取?

如果第一次匹配条件,如何跳过切片中的值

是否需要手动调用rand.Seed?

Go Template 动态获取变量

GORM中是否可能自动迁移具有循环关系的表?

在 Go sync.Map 中,为什么这部分实现不一致或者我误解了什么?

如何从 Asterisk Manager Interface Event 获取活动呼叫数

CBC Decrypter 解密加密文本,但部分文本被随机字符替换

通过环境变量配置 OTLP 导出器

致命错误:找不到由 zergon321/reisen 引起的libavcodec/avcodec.h文件

我如何解码 aes-256-cfb

将未知长度切片的值分配给Go中的 struct ?

K8s 算子读取原始数据

go 堆栈跟踪:在某些函数调用参数或返回值之后的问题(?)标记是什么意思?