【问题标题】:How does server or client know if connection broken?服务器或客户端如何知道连接是否断开?
【发布时间】:2020-01-23 10:57:13
【问题描述】:

我无法弄清楚grpc streaming 的内部工作原理。我有一个场景,我有服务器端流媒体,如果我从网络中删除客户端(通过拔出网络电缆,比如说),我没有收到任何错误或客户端或服务器端。

有人可以帮忙吗?

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

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

【问题讨论】:

    标签: go streaming grpc


    【解决方案1】:

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

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

    如果您的应用程序规范坚持一定程度的“活跃性”——比如说一个事件,甚至每 30 秒一次心跳——你可以确保服务器总是向 gRPC 流发送一个 NOP(心跳)。在这种情况下,服务器将在 30 秒内经历网络中断(更糟糕的情况)。

    同样,如果您担心客户端可能正在等待不再可访问的连接,则可以在客户端使用计时器循环 go-routine 来取消连接上下文,如果有记录(甚至是心跳)在过去 30 秒内未收到任何信息。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-20
        • 2021-12-22
        • 2019-02-23
        • 1970-01-01
        • 2015-04-04
        • 1970-01-01
        • 2011-02-22
        相关资源
        最近更新 更多