【问题标题】:How can I track "online" statuses of users if a server crashes?如果服务器崩溃,我如何跟踪用户的“在线”状态?
【发布时间】:2015-03-07 07:41:31
【问题描述】:

我有多个 heroku dynos 和一个聊天应用程序。当用户登录时,他们的状态在 MongoDB 中设置为“在线”。但是,如果服务器崩溃,其状态仍将设置为在线。服务器崩溃时如何将用户状态更新为“离线”?

如果我只有一个测功机,这将很容易。我只是在服务器启动时将每个用户更新为“离线”。不幸的是,这对于多台服务器是不可能的。

【问题讨论】:

  • 您是否在跟踪他们在您网站上的活动?
  • @gmaniac 你是什么意思?当他们登录时,我将状态设置为“在线”,当调用套接字“断开连接”事件时,我将他们的状态设置为“离线”
  • 因此,例如,如果您正在存储他们的消息,那么您可以运行 cron 或在后台运行某些东西来检查最后一个活动,如果它不在 x 时间,他们的状态将更改为不活动或离线。
  • 如果您要存储消息,则无需向 mongo 文档添加任何额外参数,_id 具有时间戳
  • @gmaniac 我想这会起作用。虽然不幸的副作用是状态永远不会 100% 准确,但会有延迟。

标签: javascript node.js mongodb heroku socket.io


【解决方案1】:

根据我们的聊天和 cmets。

最好的选择是检查最后一个活动。因此,查看最后一条消息的发送时间,如果它发生在最后一条假设 5 分钟内,如果没有活动,则将它们标记为离线。

就像我在 cmets 中提到的那样,如果您没有在消息文档中存储 date_created,则无需更改任何内容,因为 _id 存储时间戳

ObjectId("507f191e810c19729de860ea").getTimestamp()

返回此 Date 对象

ISODate("2012-10-17T20:46:22Z")

这个answer 是另一种选择(如果您想让他们保持在线,即使他们不发送消息):

如果您想知道即使它们没有从一个页面跳转到另一个页面,它们仍然处于活动状态,请添加一些 javascript 以每 60 秒左右对您的服务器执行一次 ping 操作,以让您知道它们仍然处于活动状态。它的工作方式与我最初的建议相同,但它会更新您的记录,而无需他们至少每五分钟疯狂浏览一次您的网站。

var stillAlive = setInterval(function () {
    /* XHR back to server
       Example uses jQuery */
    $.get("stillAlive.php");
}, 60000);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 2015-09-21
    相关资源
    最近更新 更多