我建议为此使用socket.io-redis,这是socket.io 的recommended 方法。因此,如果您将来扩展到多台计算机,这将按预期工作,但在当前方法中,它可能无法在多台计算机上工作,例如 AWS,在这种情况下,您也可以使用 LB 的粘性会话,但这.
socket.io 需要保持套接字打开以将事件从服务器返回到客户端(反之亦然),并且您正在运行多个工作人员,这就是为什么您会得到“消息丢失的地方很少”。
粘性负载平衡
如果您计划在不同的
进程或机器,您必须确保请求关联
使用特定的会话 ID 连接到发起的进程
他们。
你需要引入让你的服务无状态的层,你可以使用socket.io-redis
通过使用 socket.io-redis 适配器运行 socket.io,您可以运行
不同进程或服务器中的多个 socket.io 实例
都可以相互广播和发射事件。
在节点之间传递事件
您希望有多个 Socket.IO 节点接受连接,如果您想向每个人(甚至某个房间中的每个人)广播事件,您将需要某种方式在进程或计算机之间传递消息。
负责路由消息的接口就是我们所说的Adapter。您可以在 socket.io-adapter 之上实现您自己的(通过继承它),或者您可以使用我们在 Redis 之上提供的一个:socket.io-redis:
var io = require('socket.io')(3000);
var redis = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));
然后是下面的调用:
io.emit('hi', 'all sockets');
会通过Redis的Pub/Sub机制广播到每个节点。
您可以阅读更多详细信息here