这些WithKeepaliveParam是否会导致连接关闭/影响流?

问题描述

我刚刚阅读了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 (将#修改为@)