在客户端为 websockets 实现心跳的更好方法是什么?
Which is the better way to implement heartbeat on the client side for websockets?
在 websockets 的服务器端,已经有一个 ping/pong 实现,其中服务器发送一个 ping,客户端用一个 pong 回复,让服务器判断客户端是否连接。但是没有反向实现让客户端知道服务器是否仍然连接到它们。
我读过有两种方法可以解决这个问题:
- 每个客户端每隔 x 秒向服务器发送一条消息,无论何时
发送时抛出错误,这意味着服务器已关闭,因此
重新连接。
- 服务器每隔 x 秒向每个客户端发送一条消息,客户端接收此消息并更新客户端上的变量,在客户端,您有一个线程不断检查每 x 秒检查此变量是否具有已更改,如果有一段时间没有更改,则表示它没有收到来自服务器的消息,您可以假设服务器已关闭,因此重新建立连接。
您可以使用任何一种方法在客户端尝试确定服务器是否仍然在线。第一个您将向服务器发送流量,而第二个您将向服务器发送流量。两者似乎都很容易实施,但我不确定哪种方法更 efficient/cost 有效。
服务器上传速度高于客户端上传速度,但服务器 CPU 是一种昂贵的资源,而客户端 CPU 相对便宜。将逻辑卸载到客户端是一种更具成本效益的方法...
话虽如此,服务器 必须 实现此特定逻辑(实际上,所有 ping
/timeout
逻辑),否则它们可能会留下 "half-open" sockets 耗尽资源但未连接到任何客户端。
请记住,套接字(文件描述符)是一种有限的资源。它们不仅在没有流量时使用内存,而且在资源用尽时阻止新客户端连接。
因此,服务器必须使用超时或通过实现 ping
.
清除死套接字
P.S.
我不是 node.js
专家,但这种类型的逻辑应该使用 Websocket 协议 ping
而不是您的应用程序来实现。您可能应该查看 node.js
服务器/websocket 框架并检查如何启用 ping
-ing.
您应该设置 pings
以适应您的特定环境。也就是说,如果您在 Heroku 上托管,那么 Heroku 将实施约 55 秒的超时,并且您的 ping
应该在此超时发生之前发送。
在 websockets 的服务器端,已经有一个 ping/pong 实现,其中服务器发送一个 ping,客户端用一个 pong 回复,让服务器判断客户端是否连接。但是没有反向实现让客户端知道服务器是否仍然连接到它们。
我读过有两种方法可以解决这个问题:
- 每个客户端每隔 x 秒向服务器发送一条消息,无论何时 发送时抛出错误,这意味着服务器已关闭,因此 重新连接。
- 服务器每隔 x 秒向每个客户端发送一条消息,客户端接收此消息并更新客户端上的变量,在客户端,您有一个线程不断检查每 x 秒检查此变量是否具有已更改,如果有一段时间没有更改,则表示它没有收到来自服务器的消息,您可以假设服务器已关闭,因此重新建立连接。
您可以使用任何一种方法在客户端尝试确定服务器是否仍然在线。第一个您将向服务器发送流量,而第二个您将向服务器发送流量。两者似乎都很容易实施,但我不确定哪种方法更 efficient/cost 有效。
服务器上传速度高于客户端上传速度,但服务器 CPU 是一种昂贵的资源,而客户端 CPU 相对便宜。将逻辑卸载到客户端是一种更具成本效益的方法...
话虽如此,服务器 必须 实现此特定逻辑(实际上,所有 ping
/timeout
逻辑),否则它们可能会留下 "half-open" sockets 耗尽资源但未连接到任何客户端。
请记住,套接字(文件描述符)是一种有限的资源。它们不仅在没有流量时使用内存,而且在资源用尽时阻止新客户端连接。
因此,服务器必须使用超时或通过实现 ping
.
P.S.
我不是 node.js
专家,但这种类型的逻辑应该使用 Websocket 协议 ping
而不是您的应用程序来实现。您可能应该查看 node.js
服务器/websocket 框架并检查如何启用 ping
-ing.
您应该设置 pings
以适应您的特定环境。也就是说,如果您在 Heroku 上托管,那么 Heroku 将实施约 55 秒的超时,并且您的 ping
应该在此超时发生之前发送。