代码之家  ›  专栏  ›  技术社区  ›  xren

go grpc服务器不知道客户端不正常死

  •  2
  • xren  · 技术社区  · 7 年前

    我正在使用go grpc创建双向流。当我拔掉电缆时,服务器很长一段时间都不知道客户端已经死了。在这种情况下,我怎样才能检测到客户端已不在???

    2 回复  |  直到 7 年前
        1
  •  2
  •   Chris Del Guercio    7 年前

    我和你的问题完全一样。在我的例子中,当我使用Ctrl-C终止我的测试客户端时,服务器会很快检测到它,但当我使用Ctrl-Z(或者如果我切断微控制器的电源)时,服务器将永远无法关闭挂起的连接。您需要使用某种心跳来检查连接,比如使用gRPC的keepAlive功能。由于在特使背后使用gRPC存在问题,我不得不创建自己的心跳消息,并定期发送( https://github.com/envoyproxy/envoy/issues/2086 )

        2
  •  0
  •   Vitaly Isaev    7 年前

    你的 GRPC 服务器端处理程序将在下次尝试时知道客户端上下文取消 Send / Recv 发送到/来自流的消息:将返回错误:

    func (s *server) handler(stream your_service.Stream) error {
        if err := stream.Recv(); err != nil {
            // you will have context cancelation error here
        }
    }
    

    在某些情况下,明确检查上下文取消可能很有用:

    func (s *server) handler(stream your_service.Stream) error {
         // some logic
         select {
             case <-stream.Context().Done():
                 return stream.Context().Err()
             default:
         }
    }
    

    顺便问一下,你真的把电缆拔了吗?因为操作系统可能以不同的方式处理它。为什么不使用Docker之类的现代虚拟化工具进行测试?