Node.js 如何显示用户在express中是否在线?

Node.js 如何显示用户在express中是否在线?,node.js,mongodb,express,Node.js,Mongodb,Express,我正在制作一个聊天应用程序,希望添加在用户旁边显示在线/离线符号的功能。如何以最少的srever请求数和数据库写入数可靠地做到这一点 我发现的一种方法是每次用户请求页面时更新用户文档中的lastSeenAt字段,并使用该字段指示用户是否在线/离线。另一种方法是以固定的时间间隔从客户端ping服务器,然后更新lastSeenAt字段 这两种方法都需要大量的数据库写入和/或服务器请求。有没有一种方法可以更有效地实现这一点?看看哪里可以将HTTP调用与套接字结合起来。(实时通信的最佳方法是套接字)。在

我正在制作一个聊天应用程序,希望添加在用户旁边显示在线/离线符号的功能。如何以最少的srever请求数和数据库写入数可靠地做到这一点

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


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

看看哪里可以将HTTP调用与套接字结合起来。(实时通信的最佳方法是套接字)。

在发生更改时,您必须使用web套接字或服务器发送事件之类的方式将数据从服务器推送到客户端。是一个流行的工具,用于实现这种功能

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

假设您将拥有多个无状态Web服务器(常见做法),然后,一旦客户机连接或断开连接,您要通知其他感兴趣的客户机,那么您应该使用pubsub模式通知其他服务器,这些服务器将分别通知其连接的客户机。有很多实现,例如Redis、zeromq、AWS SNS、GCP Cloud pubsub。您甚至可以将其用作pubsub

但是,这可能意味着需要与服务器保持大量的持续连接,因此这可能会损害您的可扩展性。如果这对您来说成本太高,那么您可以通过一些合理的轮询来使用
lastSeenAt
方法。您只需运行一些实验,就可以发现哪个设置更适合您

如果数据库写入和请求令人担忧,您总是可以向它扔更多的服务器。您可以专门为此提供一个微服务,这样您的主服务器不会受到太大影响,而且您还可以专门为此提供一个数据库。如果性能令您担忧,您可以使用内存中的数据库

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

我建议您尽量简化设置,然后您可以进行实验,看看它如何处理您的预期流量