【发布时间】:2015-08-29 13:48:13
【问题描述】:
我一直在寻找有关为 Node.js Socket.IO 安装设置多服务器集群的帮助。这就是我想要做的:
- 在 F5 负载均衡器中有 1 个 VIP,指向
n运行 Express 和 Socket.IO 的节点服务器数量 - 让客户端通过
io.connect连接到该 1 个 VIP,然后让它过滤到负载均衡器后面的服务器之一。 - 当消息在其中任何一个服务器上发出时,它会发送给正在侦听该事件并通过其他服务器连接的所有用户。
例如 - 如果我们在 LB1 (F5) 后面有服务器 A、服务器 B 和服务器 C,并且用户 A 连接到服务器 A,用户 B 连接到服务器 B,用户 C 连接到服务器 C。
在“聊天”场景中 - 基本上,如果从服务器 A 向message 事件发出消息 - 服务器 B 和 C 也应该将消息发送到它们连接的客户端。我读到使用socket-io.redis 可以做到这一点,但它需要一个Redis 盒子——应该安装在哪个服务器上?如果所有服务器都连接到同一个 Redis 盒子 - 这会自动工作吗?
var io = require('socket.io')(server);
var redis = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));
任何帮助将不胜感激!
【问题讨论】:
-
似乎一个很好的解决方案是在 express 服务器上的不同 socket.io 实例之间启用对等通信,这样它们就可以彼此保持同步。您可以使用类似scuttlebutt 及其event emitter
-
使用
socket.io-redis适配器确实会自动(通过一些配置)实现您正在寻找的东西。只要所有 Socket.IO 实例都订阅了它,Redis 服务器将侦听哪个节点并不重要。 -
是的 - 我之前应该尝试过这个,但@hexacyanide 是正确的 - 只要每个人都连接到同一个 redis 盒子,它就可以完全开箱即用。对于以后来这篇文章的任何人 - 它只是工作。很抱歉浪费大家的时间:-(
-
如果您的问题已解决,您可以自己回答或删除它,而不是将其留在此处。
-
@gregavola 我正面临这个确切的问题。你最终在哪台服务器上运行了 redis 盒子?在我看来,redis 盒子可以在 VIP 或任何节点上运行。但是,如果带有 redis 的节点以任何方式停止运行,整个集群都会停止运行。在 VIP 上运行 redis 的想法对我来说不是很有吸引力。