我有一个nodejs聊天应用程序,其中多个客户端使用socketio连接到公共聊天室。我想将其扩展到多个节点进程,可能在不同的机器上。但是,连接到同一房间的客户端将无法保证能够访问同一节点进程。例如,用户1将命中节点进程A,用户2将命中节点进程B.它们在同一个房间,因此如果用户1发送消息,则用户2应该获得它。实现这一目标的最佳方法是什么,因为它们的连接由不同的进程管理?
我想过让节点进程连接到redis。这至少解决了进程A 知道房间中有另一个用户,用户2但是它仍然无法发送给用户2的问题,因为进程B控制着连接。有没有办法为redis注册“值已更改”的回调?
我在服务器环境中无法控制任何路由或负载平衡。
答案 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。我也想测试一下,因为我觉得越早越好了吗?