如何让 Node.js 进程相互通信

3
我有一个 nodejs 聊天应用程序,多个客户端使用 socketio 连接到一个公共聊天室。 我想将其扩展到多个节点进程,可能在不同的机器上。 但是,连接到同一房间的客户端不能保证会命中同一个节点进程。例如,用户1将连接到节点进程A,而用户2将连接到节点进程B。他们在同一个房间里,因此如果用户1发送消息,用户2应该收到它。由于它们的连接由不同的进程管理,因此如何实现这一点是最好的方式?
我考虑让节点进程连接到 Redis。这至少解决了进程A将“知道”房间中还有另一个用户(用户2)的问题,但它仍然无法向用户2发送消息,因为进程B控制该连接。是否有一种方法可以为 Redis 注册“值更改”回调函数?
我处于一个服务器环境中,无法控制任何路由或负载平衡。
2个回答

4

通过 Redis pub/sub,两个Node.js进程都可以订阅某个频道并监听您传递到该频道的消息。例如,当用户1连接到第一台机器上的进程A时,您可以在Redis中存储有关此用户的信息以及管理它的机器上的哪个进程的信息。然后,当用户2连接到第二台机器上的进程B时,向用户1发送消息,您可以将其发布到此频道,并检查哪个机器上的哪个进程负责管理与用户1的通信,并做出相应的回应。


3
我已经对此进行了一些研究。以下是我的发现:
像yojimbo87所说,你首先可以使用Redis发布/订阅(非常优化)。

http://comments.gmane.org/gmane.comp.lang.javascript.nodejs/22348

Tim Caswell写道:

我的经验是瓶颈在于数据的序列化和反序列化,而不是实际的通道。我相信你可以使用命名管道,但我不确定API是什么。msgpack似乎是数据交换的好格式。有一些库可以实现msgpack或在其上实现ipc框架。

但当序列化/反序列化成为您的瓶颈时,我会尝试使用https://github.com/pgriess/node-msgpack。我也想测试一下,因为我认为越早拥有这个越好?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接