Socket.io默认使用MemoryStore,因此所有连接的客户端将存储在内存中,这使得无法(好吧,不是完全不行,稍后会详细讲解)向连接到另一个socket.io服务器的客户端发送和接收事件。
让所有socket.io服务器接收所有事件的一种方法是让所有服务器使用redis的发布-订阅机制。因此,可以使用发布到redis代替使用socket.emit。
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代码,并通过redis传播到其他socket.io服务器。
总之,socket.io通过使用redis作为通道而不是内存在多个服务器之间发送消息。