如何在快递中显示用户是否在线?

时间:2017-10-15 10:23:26

标签: node.js mongodb express

我正在制作聊天应用,并希望添加在用户旁边显示在线/离线符号的功能。如何以最少的srever请求和数据库写入可靠地执行此操作?

我发现的一种方法是每次用户请求页面时更新用户文档中的625/(10^3)字段,并使用它来指示用户是否在线/离线。另一种方法是以固定的时间间隔从客户端ping服务器,然后更新lastSeenAt字段。

这两种方式都需要大量的数据库写入和/或服务器请求。有没有办法更有效地做到这一点?

2 个答案:

答案 0 :(得分:1)

您必须在更改时将数据从服务器推送到客户端,例如Web套接字或服务器发送事件。 socket.io是实现此功能的流行工具。

使用socket.io或特别是websockets,您可以跟踪客户端是否连接,并在数据库中有一个标记,用于跟踪客户端何时连接或 断开连接(请记住,客户端可能有多个连接(多个设备,甚至是浏览器标签),因此如果一个连接断开,他仍然可能在线。

假设您将拥有多个无状态网络服务器(通常做法),那么一旦客户端连接或断开连接,您想要通知其他感兴趣的客户端,那么您应该使用pubsub模式通知其他服务器,这些服务器将通知其连接的客户端分别。有许多实现,如Redis,zeromq,AWS SNS,GCP Cloud Pubsub。您甚至可以使用MongoDB with tailable cursors作为您的pubsub。

然而,这可能意味着与服务器的大量持续连接,因此这可能会损害您的可扩展性。如果它证明对你来说是昂贵的,那么你的lastSeenAt接近一些合理的民意调查。只需运行一些实验,您就可以找到更适合您的设置。

如果数据库写入和请求令人担忧,您可以随时向其投入更多服务器。您可以专门为此设置微服务,这样您的主服务器就不会受到太大影响,而且您可以专门为此设置数据库。如果您担心性能问题,可以使用内存数据库。

此外,您还可以通过简单的基于时间的失效在服务器中进行一些缓存,或者您可以使用pubsub模式在服务器之间同步在线/离线数据。

我建议您尝试尽可能简化设置,然后运行实验以了解它如何处理预期的流量。

答案 1 :(得分:0)

查看Express.io,您可以将HTTP调用与套接字结合使用。 (实时通信的最佳方法是套接字)。

相关问题