socket.io如何跨多个服务器发送消息?

hac*_*sid 6 websocket redis node.js socket.io

Socket.io API具有发送消息的能力所有的客户.

有了一个服务器和内存中的所有套接字,我理解该服务器如何向所有客户端发送消息,这是非常明显的.但是使用Redis存储套接字的多台服务器呢?

如果我有客户一个连接到服务器Ÿ和客户端b连接到服务器ž(以及用于商店Redis的框)和我做socket.broadcast.emit一台服务器上,在其他服务器上的客户端将收到此消息.怎么样?

实际连接到其他服务器的客户端如何获取该消息?

  • 是否有一台服务器告诉其他服务器向其连接的客户端发送消息?
  • 服务器是否与客户端建立自己的连接以发送该消息?

az7*_*7ar 9

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作为通道而不是内存来跨多个服务器发送消息.