问题描述
我刚刚阅读了gRPC repo中的自述文件,这表明如果达到例如最大连接期限,则keepalive参数可能会导致连接关闭,但是我不知道为什么在这里发生这种情况:
client.go
...
c.conn,err = grpc.Dial(fmt.Sprintf("%s:%d",c.opts.CentralDir.Address,c.opts.CentralDir.Port),grpc.WithTimeout(time.Second*5),grpc.WithMaxmsgSize(maxMessageSize),grpc.WithInsecure(),grpc.WithKeepaliveParams(keepalive.ClientParameters{
Time: 10 * time.Second,Timeout: time.Second,PermitWithoutStream: true,}),)
...
在服务器上未设置keepalive选项,因为我的意图是保持连接有效,直到用户决定断开连接为止。根据文档:
MaxConnectionAge time.Duration // The current default value is infinity.
因此,我的服务器如下所示:
server.go
...
opts := []grpc.ServerOption{
grpc.MaxSendMsgSize(maxMessageSize),grpc.MaxRecvMsgSize(maxMessageSize),}
grpcServer := grpc.NewServer(opts...)
...
我观察到的是,当该程序运行并且连接了客户端时,流似乎每隔35秒断开一次。我从这样的流中读取了一个循环:
for {
msg := &proto.Message{}
if err := s.stream.RecvMsg(msg); err != nil {
return err
}
}
这返回rpc error: code = Unavailable desc = transport is closing
,但是我仍然可以在同步RPC函数上发送消息。
我觉得这很奇怪。我每10秒发送一次ping的唯一原因是保持流保持活动状态。我在这里想念东西吗?
https://github.com/grpc/grpc-go/issues/3837
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)