Node.js多台机器上的tcp套接字服务器

我有一个node.js tcp服务器,用作iPhone聊天客户端的后端。 由于我的实现包括私人群聊,因此我在内存中存储了用户列表和聊天室,以便适当地路由邮件。 假设我的聊天服务器总是在一台机器上,这一切都可以正常工作,但是如果我需要水平扩展,我需要一种将消息广播到连接到不同服务器的客户端的好方法。 我不想开始在节点服务器之间进行进程间通信,并希望与redis共享状态。

我有一些想法,但我想知道如果有人有这个好的解决scheme? 这里要清楚的是一个例子:

用户1连接到X房间的服务器1,用户2连接到X房间的服务器2.用户1发送一条消息,我需要这个消息传递给用户2,但是由于我使用的是内存数据结构,分享国家。 我希望我的节点服务器保持尽可能的愚蠢,所以我可以添加/删除我的系统的需求。

谢谢 :)

您可以使用跨越进程的消息传递层(使用类似pub / sub的东西):

Message Queue ------------------------------------------------------------------------------- | | ServerA ServerB ------- ------- Room 1: User1, User2 Room 1: User3, User5 Room 2: User4, User7, User11 Room 2: User6, User8 Room 3: User9, User13 Room 3: User10, User12, User14 

假设用户1发送聊天消息。 ServerA在消息队列上发送一个消息,说“房间1中的用户1说了些什么”(连同他们所说的)。 每个其他服务器进程监听这样的事件,因此,在本例中,ServerB将会看到它需要将来自User1的消息分发给它自己的 Room 1中的所有用户。可以用这种方式扩展到许多进程 – 每个进程新进程只需要确保他们在队列上听取适当的消息。

Redis具有发布/订阅function ,如果您已经在使用Redis,则可以使用此function。 另外,还有其他的第三方工具,比如ZeroMQ ; 也请看这个问题 。

在不久的将来,Redis应该已经构build了集群支持,同时您可以使用一致的散列algorithm将密钥均匀分布到多个服务器上。 有人在那里有一个node.js的哈希模块,它是专门为node.js的Redis集群模块实现一致哈希。 您可能需要closures“房间”名称,以确保房间的所有数据点都在同一台主机上。 使用这种types的安装程序,所有要使用的服务器逻辑都保留在客户端上,因此您的Redis群集基本可以保持不变,您可以轻松地添加或删除主机。

更新

我发现我在谈论的redis的一致性哈希实现,它给出了代码当然,也解释了易于消化的方式分片。

http://ngchi.wordpress.com/2010/08/23/towards-auto-sharding-in-your-node-js-app/