服务器或客户端如何知道连接是否断开?

时间:2020-01-23 10:57:13

标签: go streaming grpc

我无法弄清grpc streaming的内部工作。在我有服务器端流传输的情况下,如果我从网络中删除客户端(通过拉出网络电缆,可以说),则不会出现任何错误,也不会出现客户端或服务器端的错误。

有人可以在这里帮忙吗?

如果我杀死服务器,客户端就会知道。如果我杀死客户端,服务器就会知道。但是没有发现断开连接。

我想知道为什么它不起作用以及在服务器或客户端被杀死的情况下它如何起作用。是否发送了一些heartbeat消息来检查连接性或如何完成?我的意思是,如果我每30秒发送一次数据,它如何工作?

2 个答案:

答案 0 :(得分:3)

如果中间网络路径暂时消失,则Internet将无法工作。 闲置的网络连接应该能够容忍暂时的网络路径消失。

看到服务器/客户端连接断开时,任何一方断开连接的原因是由于主动断开了与应用程序层(网络层7)向下的连接。 断开物理电缆,仅切断physical network layer,其效果不一定会向上级联,尤其是在空闲连接的情况下。

如果您的应用程序规范坚持一定级别的“活动性”(每30秒说一次事件,甚至发出心跳信号),则可以确保服务器始终向gRPC流发送甚至NOP(心跳信号)。在这种情况下,服务器将在30秒内经历网络中断(甚至更糟)。

类似地,如果您担心客户端可能正在等待无法再建立的连接,则如果有记录(甚至是心跳),则可以在客户端使用计时器循环的go-routine来取消连接上下文最近30秒钟没有收到蜂。

答案 1 :(得分:1)

gRPC支持客户端和服务器之间的keepalive: https://godoc.org/google.golang.org/grpc/keepalive