hac*_*sid 6 websocket redis node.js socket.io
该Socket.io API具有发送消息的能力所有的客户.
有了一个服务器和内存中的所有套接字,我理解该服务器如何向所有客户端发送消息,这是非常明显的.但是使用Redis存储套接字的多台服务器呢?
如果我有客户一个连接到服务器Ÿ和客户端b连接到服务器ž(以及用于商店Redis的框)和我做socket.broadcast.emit一台服务器上,在其他服务器上的客户端将收到此消息.怎么样?
实际连接到其他服务器的客户端如何获取该消息?
Socket.io默认使用MemoryStore,因此所有连接的客户端都将存储在内存中,使得连接到不同的socket.io服务器的客户端发送和接收事件变得不可能(好吧,不安静,但稍后会更多).
使所有socket.io服务器接收所有事件的一种方法是所有服务器都使用redis的pub-sub.因此,使用socket.emit可以发布到redis.
redis_client = require('redis').createClient();
redis_client.publish('channelName', data);
Run Code Online (Sandbox Code Playgroud)
并且所有套接字服务器都通过redis订阅该通道,并在收到消息时将其发送给连接到它们的客户端.
redis_sub = require('redis').createClient();
redis_sub.subscribe('channelName', 'moreChannels');
redis_sub.on("message", function (channel, message) {
socket.emit(channel, message);
});
Run Code Online (Sandbox Code Playgroud)
复杂的东西!! 但是等等,结果你实际上并不需要这种代码来实现目标.Socket.io有RedisStore,它基本上可以以更好的方式执行上面代码应该做的事情,这样你就可以像编写单个服务器那样编写Socket.io代码,并且仍然可以通过它传播到其他socket.io服务器Redis的.
总结一下,socket.io通过使用redis作为通道而不是内存来跨多个服务器发送消息.