【问题标题】:How does Facebook know if someone is onlineFacebook如何知道某人是否在线
【发布时间】:2013-09-01 08:18:47
【问题描述】:

我正在使用 Node.js(Express 框架)和 socket.io 做一个实时网站,在某些时候它必须检测是否有人“在线”(基本上是如果有人打开了网页)。

我认为 Facebook 聊天就是一个群组示例。但它背后的工程逻辑是什么?

非常感谢!

【问题讨论】:

  • 你使用什么形式的用户认证?
  • 这是在登录页面之后。在登录页面上,这是一个标准 POST 请求,发送到服务器以进行数据库用户身份验证

标签: javascript node.js sockets express redis


【解决方案1】:

不确定 Facebook 究竟是如何做到这一点的,但如果您向其中包含 javascript 的用户提供一个页面,这会以特定间隔发出异步请求,每分钟说一次。然后,当您收到请求时,用户被标记为在线,超时略大于 ajax 间隔。如果超时到期而没有另一个 ajax 请求,则将用户标记为脱机。

您可以挂钩页面加载和页面关闭事件,仅在用户加载页面或离开页面时发送请求。这将需要更少的请求。

编辑

我看到您使用套接字 io 我对此不是很熟悉,但我想您可以使用提供的套接字连接/断开事件。

【讨论】:

  • 感谢您的回答。我目前正在使用页面加载/关闭事件,但是当用户在多个选项卡中打开网页时它会变得混乱。当用户疯狂地按 F5 时,它也可能会搞砸
  • 是的,我猜页面关闭事件会导致多个选项卡出现问题。 stackoverflow.com/questions/12166187/… 这可能会有所帮助
  • stackoverflow.com/questions/1051895/… 间隔 ping 似乎是一个常见的解决方案
【解决方案2】:

客户端定期向服务器发送keep-alive消息,在客户端JS中实现。

如果服务器在某个超时时间内没有收到keep-alive,它可以将用户标记为离线。当 websocket 显式关闭时也可以这样做。

【讨论】:

    【解决方案3】:

    这张来自 Facebook 的幻灯片 (http://www.erlang-factory.com/upload/presentations/31/EugeneLetuchy-ErlangatFacebook.pdf) 详细解释了它的消息系统。系统有comet(channel)集群,保持与浏览器的TCP连接,并定期将连接的用户列表推送到Presence Server。所以网页(PHP)可以查询用户是否在线。

    【讨论】:

      猜你喜欢
      • 2011-07-23
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      相关资源
      最近更新 更多