我正在做一个使用Node.js (快速框架)和socket.io的实时网站,在某种程度上它必须检测是否有人在线(这基本上是如果有人打开了网页)。
我认为Facebook chat就是一个很好的例子。但是它背后的工程逻辑是什么呢?
非常感谢!
发布于 2013-08-29 18:05:09
这张来自Facebook的幻灯片(http://www.erlang-factory.com/upload/presentations/31/EugeneLetuchy-ErlangatFacebook.pdf)详细解释了它的消息系统。系统具有comet(channel)集群,保持与浏览器的TCP连接,并定期将连接的用户列表推送到在线状态服务器。因此,网页(PHP)可以查询在线状态服务器用户是否在线。
发布于 2013-08-29 11:44:18
我不确定Facebook是如何做到这一点的,但如果你向用户提供一个包含javascript的页面,这会以特定的时间间隔发出异步请求,比如每分钟一次。然后,当您收到请求时,用户被标记为在线,超时时间略大于ajax间隔。如果在没有其他ajax请求的情况下超时,则将用户标记为离线。
您可以挂接到页面加载和页面关闭事件,以便仅在用户加载或离开页面时发送请求。这将需要更少的请求。
编辑
我看到您在使用socket io,我对此不是很熟悉,但我想您可以使用提供的socket连接/断开事件。
发布于 2013-08-29 11:57:02
客户端周期性地向服务器发送保活消息,在客户端JS中实现。
如果服务器在某个超时时间内没有接收到keep-alive,它可以将用户标记为离线。它还可以在显式关闭websocket时执行此操作。
https://stackoverflow.com/questions/18501788
复制相似问题