Socket.io 默认使用 MemoryStore,因此所有连接的客户端都将存储在内存中,从而无法(嗯,不是安静,但稍后会详细介绍)从连接到不同 socket.io 服务器的客户端发送和接收事件。
让所有 socket.io 服务器接收所有事件的一种方法是所有服务器都使用 redis 的 pub-sub。因此,使用 socket.emit 可以发布到 redis。
redis_client = require('redis').createClient();
redis_client.publish('channelName', data);
所有套接字服务器都通过 redis 订阅该通道,并在收到消息后将其发送给连接到它们的客户端。
redis_sub = require('redis').createClient();
redis_sub.subscribe('channelName', 'moreChannels');
redis_sub.on("message", function (channel, message) {
socket.emit(channel, message);
});
复杂的东西!!但是等等,事实证明你实际上并不需要这种代码来实现目标。Socket.io 具有 RedisStore,它基本上以更好的方式完成了上面的代码应该做的事情,这样您就可以像为单个服务器编写一样编写 Socket.io 代码,并且仍然会通过传播到其他 socket.io 服务器雷迪斯。
总结 socket.io 通过使用 redis 作为通道而不是内存来跨多个服务器发送消息。