去grpc服务器不知道客户端非常死

时间:2017-12-21 09:53:01

标签: go grpc

我正在使用go-grpc来创建双向流。当我拔掉电缆时,服务器不知道客户端已经很长时间没电了。在这种情况下,如何检测客户端已消失?

2 个答案:

答案 0 :(得分:1)

您的GRPC服务器端处理程序将在下次尝试向/从流发送Send / Recv消息时知道客户端上下文取消:将返回错误:< / p>

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)进行测试?

答案 1 :(得分:0)

我遇到了与你完全相同的问题。在我的情况下,当我使用Ctrl-C终止我的测试客户端时,服务器很快就检测到它,但是当我使用Ctrl-Z时(或者如果我切断了微控制器的电源),服务器将永远关闭挂连接。您需要使用某种心跳来检查连接,例如使用gRPC的keepAlive功能。由于在Envoy(https://github.com/envoyproxy/envoy/issues/2086)后面使用gRPC出现问题,我不得不创建自己的心跳消息,这是我定期发送的消息

相关问题