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

Posted

技术标签:

【中文标题】如何让 Node.js 进程相互通信【英文标题】:How to get Node.js processes communicate with one another 【发布时间】:2011-10-12 10:50:49 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

我已经对此进行了一些研究。下面是我的发现:

就像yojimbo87说的你先用redis pub/sub(非常优化)。

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

蒂姆·卡斯威尔写道:

根据我的经验,瓶颈是序列化和 数据的反序列化,而不是实际的通道。我相当确定 您可以使用命名管道,但我不确定 API 是什么。消息包 似乎是数据交换的好格式。有几个 在上面实现 msgpack 或 ipc 框架的库 它。

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

【讨论】:

以上是关于如何让 Node.js 进程相互通信的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Heroku 上使用 Node.js 通信 Web 和 Worker dynos?

Node.js 的有状态的进程间通信

Node.js进程通信模块child_process

让node.js与其它语言进行通信(thrift),并使用zookeeper做服务协同

走进Node.js之多进程模型

系列3|走进Node.js之多进程模型