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

时间:2011-07-25 09:36:18

标签: node.js heroku redis socket.io

我有一个nodejs聊天应用程序,其中多个客户端使用socketio连接到公共聊天室。我想将其扩展到多个节点进程,可能在不同的机器上。但是,连接到同一房间的客户端将无法保证能够访问同一节点进程。例如,用户1将命中节点进程A,用户2将命中节点进程B.它们在同一个房间,因此如果用户1发送消息,则用户2应该获得它。实现这一目标的最佳方法是什么,因为它们的连接由不同的进程管理?

我想过让节点进程连接到redis。这至少解决了进程A 知道房间中有另一个用户,用户2但是它仍然无法发送给用户2的问题,因为进程B控制着连接。有没有办法为redis注册“值已更改”的回调?

我在服务器环境中无法控制任何路由或负载平衡。

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

我已经做过(做过)一些研究。低于我的发现:

像yojimbo87所说,你首先只使用redis pub / sub(非常优化)。

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

蒂姆卡斯韦尔写道:

  

根据我的经验,瓶颈是序列化和   数据的反序列化,而不是实际的通道。我相当确定   你可以使用命名管道,但我不确定API是什么。 msgpack   对于数据交换来说似乎是一种很好的格式。有几个   在那里实现msgpack或ipc框架的库   它

但是当序列化/反序列化成为你的瓶颈时,我会尝试使用https://github.com/pgriess/node-msgpack。我也想测试一下,因为我觉得越早越好了吗?