Javascript “我如何跟踪”;“在线”;服务器崩溃时用户的状态?

Javascript “我如何跟踪”;“在线”;服务器崩溃时用户的状态?,javascript,node.js,mongodb,heroku,socket.io,Javascript,Node.js,Mongodb,Heroku,Socket.io,我有多个heroku dynos和一个聊天应用程序。当用户登录时,他们的状态在MongoDB中设置为“在线”。但是,如果服务器崩溃,其状态仍将设置为联机。当服务器崩溃时,如何将用户状态更新为“脱机” 如果我只有一个dyno,这会很容易。我只需要在服务器启动时将每个用户更新为“脱机”。不幸的是,这在多台服务器上是不可能的。根据我们的聊天和评论 最好的选择是对照上一个活动进行检查。因此,查看最后一条消息是何时发送的,如果它发生在最近的5分钟内,如果没有活动,则将其标记为脱机 正如我在评论中提到的,如

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


如果我只有一个dyno,这会很容易。我只需要在服务器启动时将每个用户更新为“脱机”。不幸的是,这在多台服务器上是不可能的。

根据我们的聊天和评论

最好的选择是对照上一个活动进行检查。因此,查看最后一条消息是何时发送的,如果它发生在最近的5分钟内,如果没有活动,则将其标记为脱机

正如我在评论中提到的,如果您没有在messages文档上存储创建的日期,您将不必更改任何内容,因为id存储了时间戳

ObjectId("507f191e810c19729de860ea").getTimestamp()
返回此日期对象的

ISODate("2012-10-17T20:46:22Z")
这是另一个选项(如果您想让他们保持在线,即使他们不发送消息):

如果您想知道它们在不从一页跳到另一页的情况下仍处于活动状态,请每60秒左右添加一点javascript以ping您的服务器,让您知道它们仍然处于活动状态。它的工作方式与我最初的建议相同,但它将更新您的记录,而不需要他们每五分钟至少疯狂浏览您的网站一次


你在你的网站上跟踪他们的活动吗?@gmaniac你是什么意思?当他们登录时,我将状态设置为“online”,当调用套接字“disconnect”事件时,我将他们的状态设置为“offline”例如,如果您正在存储他们的消息,那么您可以在后台运行一个cron或其他东西来检查最后一个活动,如果它不在
x
时间内,则它们的状态将更改为非活动或脱机。如果您正在存储消息,则不必向mongo文档添加任何额外参数,
\u id
具有timestamp@gmaniac我想那会有用的。虽然一个不幸的副作用是状态永远不会100%准确,但会有延迟。
var stillAlive = setInterval(function () {
    /* XHR back to server
       Example uses jQuery */
    $.get("stillAlive.php");
}, 60000);