我正在构建一个node.js应用程序。当用户连接时,他们将其状态作为在线传输。断开连接后,状态将切换为脱机状态。此外,当用户连接时,他会获得他的连接列表以及这些朋友的状态(在线或离线)。好的,很好,没问题。
但我遇到的麻烦是如何在我登录时动态发送用户freind的状态。所以,步骤如下:
请记住,这些用户彼此之间没有连接,并且还记得用户的状态需要传输给将他作为朋友的所有其他用户。假设user1有100个朋友,我就是其中之一。我(以及其他99个)需要获得user1现在处于脱机状态的通知。另请注意,这些人可能不在同一物理服务器上(多个服务器处理每个X连接数)。解决这个问题的最佳理论方法是什么?
我能想出的唯一答案是我将状态保存在数据库中,该节点将查询数据库,当状态发生变化时,它将更新。但似乎很疯狂,节点必须注意数据库的更改,这无法扩展。必须有一个更好的方法来做到这一点 - 也许是一个明显的方法,我很想念它。
答案 0 :(得分:3)
正如ebohlman在评论中暗示的那样,发布/订阅模式(也称为“pub / sub”)听起来适用于您的问题。在发布/订阅体系结构中,发布者不是将发送消息发送到特定客户端,而是将消息发送到某个中央发布/订阅服务器。订阅者通知此服务器他们感兴趣的消息类型或“主题”。关键是发布者和订阅者永远不会知道甚至关心彼此,使得模式非常可扩展(可以有任意数量的出版商或订阅者。)
在您的情况下,处理用户登录/注销的每个服务器都可能订阅“login_changed”主题。每当用户登录或注销时,处理该更改的服务器将向pub / sub服务器发送一条消息,其主题为“login_changed”,同时还有一些数据指示发生了什么(例如,使用JSON编码的字符串)。订阅了“login_changed”主题的每个服务器都将收到该消息,并且每个服务器都可以确定他们是否负责跟踪相关用户。
管理pub / sub模式有几种常用工具。 Redis,一个常见的键值存储,has support for pub/sub,是我个人最喜欢的工具。 AMQP是一个开放标准,包含多种与消息传递相关的行为,包括发布/订阅,并且many implementations,其中最常见的可能是RabbitMQ。如果您对通过HTTP连接Web客户端感兴趣,可能会对Faye之类的内容感兴趣。有很多关于这个主题的文献,以及许多语言的许多实现;谷歌搜索应该会带你走远。