Node.js 跨多台服务器扩展Socket.IO

Node.js 跨多台服务器扩展Socket.IO,node.js,express,socket.io,Node.js,Express,Socket.io,我一直在四处寻找关于为Node.js Socket.IO安装设置多服务器集群的帮助。这就是我想做的: 在F5 loadbalancer中有1个VIP,指向运行Express和Socket.IO的节点服务器的数量 让客户端通过io连接到1个VIP。连接,然后将其筛选到loadbalancer后面的一个服务器 当消息在这些服务器中的任何一台上发出时,它将发送给正在侦听该事件并通过其他服务器连接的所有用户 例如,如果在LB1(F5)后面有服务器A、服务器B和服务器C,并且用户A连接到服务器A,用户

我一直在四处寻找关于为Node.js Socket.IO安装设置多服务器集群的帮助。这就是我想做的:

  • 在F5 loadbalancer中有1个VIP,指向运行Express和Socket.IO的节点服务器的数量
  • 让客户端通过io连接到1个VIP。连接,然后将其筛选到loadbalancer后面的一个服务器
  • 当消息在这些服务器中的任何一台上发出时,它将发送给正在侦听该事件并通过其他服务器连接的所有用户
例如,如果在LB1(F5)后面有服务器A、服务器B和服务器C,并且用户A连接到服务器A,用户B连接到服务器B,用户C连接到服务器C

在“聊天”场景中-基本上,如果消息从服务器a发送到
消息
事件-服务器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 }));

任何帮助都将不胜感激,谢谢

这个问题的答案是,您必须在SocketIO集群之外设置一个Redis服务器,并让所有节点连接到该服务器

然后,您只需在代码的顶部添加它,它就可以神奇地工作,没有任何问题

var io = require('socket.io')(server);
var redis = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));

解决这个问题的一个好办法似乎是在express服务器上的不同socket.io实例之间启用点对点通信,这样它们就可以彼此保持同步。您可以使用类似的工具和它来实现这一点。使用
socket.io redis
适配器确实会自动(通过一些配置)实现您想要的功能。只要所有Socket.IO实例都已订阅,Redis服务器将侦听哪个节点并不重要?如果是的话,你对它有什么不了解?它似乎是为你的特殊情况而设计的。是的-我以前应该尝试过这个,但是@hexa氰化物是正确的-只要每个人都连接到同一个redis盒子上,它就完全可以在盒子外工作。对于任何稍后来到这篇文章的人来说,这很有效。对不起,浪费了大家的时间:-(如果你的问题已经解决了,你可以自己回答或者删除它,而不是把它放在这里。