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

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

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

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

【问题讨论】:

    标签: node.js heroku redis socket.io


    【解决方案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。我也想测试一下,因为我认为你越早拥有它越好?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-09
        • 1970-01-01
        • 1970-01-01
        • 2013-05-03
        • 2021-11-07
        相关资源
        最近更新 更多