【问题标题】:Which is the better way to implement heartbeat on the client side for websockets?在客户端为 websocket 实现心跳的更好方法是什么?
【发布时间】:2017-03-15 22:03:13
【问题描述】:

在 websockets 的服务器端已经有一个 ping/pong 实现,服务器发送一个 ping,客户端用一个 pong 回复,让服务器节点不管客户端是否连接。但是没有反向实现让客户端知道服务器是否仍然连接到它们。

我读过有两种方法可以解决这个问题:

    1. 每个客户端每隔 x 秒和任何时间向服务器发送一条消息 发送时抛出错误,这意味着服务器已关闭,所以 重新连接。
    1. 服务器每 x 秒向每个客户端发送一条消息,客户端接收此消息并更新客户端上的变量,在客户端,您有一个线程每隔 x 秒不断检查该变量是否已更改,如果它有一段时间没有,则表示它没有收到来自服务器的消息,您可以假设服务器已关闭,因此重新建立连接。

您可以尝试使用任一方法在客户端确定服务器是否仍然在线。第一个您将向服务器发送流量,而第二个您将从服务器发送流量。两者似乎都很容易实施,但我不太确定哪种方式更高效/更具成本效益。

【问题讨论】:

    标签: node.js websocket client-server


    【解决方案1】:

    服务器上传速度高于客户端上传速度,但服务器 CPU 是一种昂贵的资源,而客户端 CPU 相对便宜。将逻辑卸载到客户端是一种更具成本效益的方法...

    话虽如此,服务器必须实现这个特定的逻辑(实际上,所有ping/timeout逻辑),否则它们可能会留下"half-open" sockets,这会消耗资源但不是连接到任何客户端。

    请记住,套接字(文件描述符)是一种有限资源。它们不仅在没有流量的情况下使用内存,而且在资源耗尽时阻止新客户端连接。

    因此,服务器必须清除死套接字,要么使用超时,要么实现ping

    附言

    我不是node.js 专家,但是这种类型的逻辑应该使用Websocket 协议ping 而不是您的应用程序来实现。您可能应该查看node.js 服务器/websocket 框架并检查如何启用ping-ing。

    您应该设置pings 以适应您的特定环境。即,如果您在 Heroku 上托管,则 Heroku 将实施约 55 秒的超时,并且您的 pings 应在此超时发生之前发送。

    【讨论】:

    • 浏览器不公开 WebSocket ping 机制,因此对于这些,需要应用程序级别的机制,以便客户端可以检测到断开连接。否则,WebSocket 库应该公开ping 机制,当然应该使用它。
    猜你喜欢
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 2016-03-11
    • 2011-01-13
    • 2011-01-05
    • 2011-03-09
    • 2011-12-21
    相关资源
    最近更新 更多