Trello 显示在线/离线/空闲状态的信息,我个人看到的非常准确。有几种用于跟踪用户在线状态的解决方案,而要准确地做到这一点需要很大的开销。也存在不知道用户是否关闭浏览器、断开连接等的传统问题,导致离线/空闲状态显示不准确。对于一个没有聊天功能的平台(我相信这会花费跟踪用户状态的开销,因此最终使任务变得容易)Trello 如何实现这一点,尽管没有太多开销?
Trello 还能够检测断开连接并恢复连接(虽然不是那么顺利)。
Trello 的 Pushing 和 Polling 层在此处描述
Trello 显示在线/离线/空闲状态的信息,我个人看到的非常准确。有几种用于跟踪用户在线状态的解决方案,而要准确地做到这一点需要很大的开销。也存在不知道用户是否关闭浏览器、断开连接等的传统问题,导致离线/空闲状态显示不准确。对于一个没有聊天功能的平台(我相信这会花费跟踪用户状态的开销,因此最终使任务变得容易)Trello 如何实现这一点,尽管没有太多开销?
Trello 还能够检测断开连接并恢复连接(虽然不是那么顺利)。
Trello 的 Pushing 和 Polling 层在此处描述
每个浏览器选项卡都被视为一个会话,与一个用户相关联。每个会话的活动级别都被单独跟踪,用户在其所有会话中显示为最高活动级别(其中活动最高,然后空闲,然后断开连接)。
每个选项卡都会定期将其当前状态发送到服务器——如果它有一个工作的 WebSocket,则每分钟发送一次,否则每 5 分钟发送一次。每次选项卡获得焦点或有 keydown 或 mousedown 事件时,当前状态都会重置为活动状态。如果距离最近的这些事件超过 5 分钟,它就会空闲。该选项卡在 onunload 事件中发送断开连接的状态,但我们不依赖于此。
每次会话将其状态发送到服务器时,服务器都会查看该用户的所有会话以确定这是否表明用户状态发生了变化。如果是这样,它会将新状态广播给每个观看该用户所在的每个板的人(这与 Trello 的其余即时更新所经历的框架相同,并且在这里解释太复杂了)。
服务器还会检查每个会话,看看它是否距离我们收到该会话的时间太长(如果它是 WebSocket 会话,则为 2 分钟,否则为 10 分钟)并删除会话(如果已删除会话表示它已断开连接) )。
那里隐藏着一些优化,但这是主要的故事。
Trello 使用 socket.io .. 因此,当用户登录时,它会广播一条用户已登录的消息,然后他们将他显示为在线。一旦他断开连接,他们就会再次在套接字上发送一条消息以显示他离线。
许多实时应用程序使用 socket.io 来显示实时活动。