【问题标题】:How does Trello show users online/offline/idle state accurately?Trello 如何准确地向用户显示在线/离线/空闲状态?
【发布时间】:2014-03-17 21:21:54
【问题描述】:

Trello 显示在线/离线/空闲状态的信息非常准确,正如我亲眼所见。有几种解决方案可以跟踪用户的在线状态,而要准确地做到这一点需要很大的开销。也存在不知道用户是否关闭浏览器、断开连接等的传统问题,导致离线/空闲状态显示不准确。对于一个没有聊天功能的平台(我相信这会花费跟踪用户状态的开销,因此最终使任务变得容易)Trello 如何实现这一点,尽管没有太多开销?

Trello 还能够检测断开连接并恢复连接(虽然不是那么顺利)。

Trello 的 Pushing 和 Polling 层描述为here

【问题讨论】:

  • 您可能想查看 NodeUp 的 this 剧集。 Trello 的开发人员接受了采访,并详细讨论了他们的用户存在检测方法。

标签: backbone.js coffeescript trello


【解决方案1】:

每个浏览器选项卡都被视为一个会话,与一个用户相关联。每个会话的活动级别都被单独跟踪,用户在其所有会话中的活动级别最高(活动最高,然后空闲,然后断开连接)。

每个选项卡都会定期将其当前状态发送到服务器 - 如果它有一个工作的 WebSocket,则每分钟发送一次,否则每 5 分钟发送一次。每次选项卡获得焦点或有 keydown 或 mousedown 事件时,当前状态都会重置为活动状态。如果距离最近的这些事件超过 5 分钟,它就会空闲。选项卡在 onunload 事件中发送断开状态,但我们不依赖于此。

每次会话将其状态发送到服务器时,服务器都会查看该用户的所有会话,以确定这是否表明用户状态发生了变化。如果是这样,它会将新状态广播给观看用户所在的每个板的每个人(这与 Trello 的其余即时更新所经历的框架相同,并且在这里解释起来太复杂了)。

服务器还会检查每个会话,看看它是否距离我们收到该会话的时间过长(如果是 WebSocket 会话,则为 2 分钟,否则为 10 分钟),如果已经过,则删除该会话(删除会话表示它已断开连接)。

其中隐藏着一些优化,但这是主要故事。

【讨论】:

  • 虽然不建议按照 SO,但我还是要感谢您的回答 :)
【解决方案2】:

Trello 使用 socket.io.. 所以当用户登录时,它会广播一条用户已登录的消息,然后他们显示他在线。 一旦他断开连接,他们就会再次在套接字上发送一条消息以显示他离线。

许多实时应用程序使用 socket.io 来显示实时活动。

【讨论】:

  • Trello 不再使用socket.io(支持旧客户端除外)。
  • @AaronDufour 我刚刚提取了他们的 js,它就在那里:This application uses other third-party javascript components distributed under appropriate licenses. For more information, see the following: ... socket.io.js http://socket.io/
  • @jcollum 代码还在里面,但它已经死了。如果我们的新套接字解决方案不能大规模支持,我们希望能够轻松地退回到它,但它确实做到了。我是一名 Trello 开发人员,郑重声明。
  • @AaronDufour 我只是给出一个想法。 Socket.io 很难在多个 dynos(集群环境)上扩展。因此,对于大规模应用程序,人们要么管理自己的套接字服务器,要么使用大约 30 方套接字客户端。但是所有第三方客户端也在套接字之上工作。我的团队正在使用 Pusher 作为套接字客户端。
  • @AaronDufour:Trello 是一款不错的应用。甚至我的团队也在使用它。我们有如此实时的活动,例如聊天和实时提要。我们在 socket.io 上构建了解决方案。但是在部署在 heroku 上时面临扩大规模的问题。所以如果我们部署在多个 dyono 上,应用程序就会中断。现在我们正在使用“推杆”。您能提出更好的解决方案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
  • 2020-12-08
  • 1970-01-01
  • 2020-11-15
  • 2022-01-10
相关资源
最近更新 更多