我正在使用go-grpc来创建双向流。当我拔掉电缆时,服务器不知道客户端已经很长时间没电了。在这种情况下,如何检测客户端已消失?
答案 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出现问题,我不得不创建自己的心跳消息,这是我定期发送的消息