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

Socket.io API可以将消息发送给所有的客户端。

使用一个服务器和所有内存中的套接字,我知道这个服务器可以向所有的客户端发送消息,这很明显。 但是,使用Redis存储套接字的多台服务器呢?

如果我有客户端连接到服务器y和客户端b连接到服务器z (和商店的Redis框),并且我在一台服务器上执行socket.broadcast.emit ,另一台服务器上的客户端将收到此消息。 怎么样?

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

  • 一台服务器是否告诉其他服务器向其连接的客户端发送消息?
  • 服务器是否build立自己的连接到客户端来发送消息?

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服务器Redis的。

总结一下,socket.io通过使用redis作为通道而不是内存来跨多个服务器发送消息。

有几种方法可以做到这一点。 在这个问题的更多信息。 有关Redis中的pub / sub如何工作的很好的解释,请参阅Redis的文档 。 在维基百科上,这个范式的工作原理的解释在这里 。

引用Redis文档:

SUBSCRIBE,UNSUBSCRIBE和PUBLISH实现发布/订阅消息范例,其中(引用维基百科)发送者(发布者)未被编程为将其消息发送到特定接收者(订户)。 相反,发布的消息被表征为频道,而不知道可能有哪些(如果有的话)用户。 订阅者expression对一个或多个频道的兴趣,并且只接收感兴趣的消息,而不知道哪些(如果有的话)发布者。 发布者和订阅者的这种分离可以实现更好的可扩展性和更dynamic的networking拓扑。