2017-10-15 66 views
0

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

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

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

回答

0

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

1

您必须在更改时将服务器的数据推送到客户端,例如web-sockets或服务器发送的事件。 socket.io是实现这种功能的流行工具。

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

假设您将有多个无状态web服务器(一般惯例),那么一旦客户端连接或断开连接,您要通知其他有兴趣的客户,那么你应该使用pubsub模式来通知其他服务器,这将分别通知其连接的客户端,有很多实现,例如Redis,zeromq,AWS SNS,GCP Cloud Pubsub,甚至可以使用MongoDB with tailable cursors作为您的pubsub。

但是,这可能意味着很多不断连接到您的服务器,所以这可能会伤害您的可玩性。如果它证明是昂贵的,那么你的lastSeenAt方法与一些理智的民意测验。只需运行一些实验,您就可以找出哪些设置更适合您的设置。

如果数据库写入和请求的问题,你可以随时抛出更多的服务器。您可以专门为此设置一个微服务,以便您的主服务器不会受到太多影响,而且您可以专门为此设置数据库。如果性能令您担忧,则可以使用内存数据库。

此外,您还可以在服务器中使用简单的基于时间的失效缓存一些缓存,或者您可以使用pubsub模式将服务器之间的联机/脱机数据同步。

我会建议尽量让您的设置尽可能简单,并且您可以运行实验来了解它如何处理您的预期流量。