对于websockets,在客户端实现心跳的哪种方法更好?

时间:2017-03-15 22:03:13

标签: node.js websocket client-server

在服务器端,对于websockets,已经有一个ping / pong实现,其中服务器发送ping并且客户端使用pong回复让服务器节点是否连接了客户端。但是没有反向实现的东西让客户知道服务器是否仍然连接到它们。

我读过两种方法:

    1. 每个客户端每隔x秒就会向服务器发送一条消息 发送时抛出错误,表示服务器已关闭,所以 重新连接。
    1. 服务器每x秒向每个客户端发送一条消息,客户端收到此消息并更新客户端上的变量,在客户端,您有一个不断检查每x秒的线程,检查此变量是否已更改,如果它暂时没有意味着它没有从服务器收到消息,你可以认为服务器已关闭,因此重新建立连接。

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

1 个答案:

答案 0 :(得分:1)

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

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

请记住,套接字(文件描述符)是有限的资源。即使没有流量,它们不仅会使用内存,而且会在资源最大化时阻止新客户端连接。

因此,服务器必须使用超时或实施ping清除死套接字。

P.S。

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

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