socket.io如何在多个服务器之间发送消息



Socket.io API能够向所有客户端发送消息。

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

如果我的客户端a连接到服务器y,客户端b与服务器z(以及存储的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);

所有的套接字服务器都通过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.i0代码一样编写代码,并且仍然可以通过redis传播到其他Socket.io服务器。

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

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

引用Redis文档:

SUBSCRIBE、UNSUBSCRIBE和PUBLISH实现发布/订阅消息传递范式,其中(引用维基百科)发送者(出版商)未编程为向特定接收器发送消息(订阅者)。相反,已发布的消息被表征为频道,而不知道可能有什么(如果有的话)订户。订阅者表示对一个或多个频道感兴趣,并且只接收感兴趣的消息,但不知道是什么(如果有的话)那里有出版商。这种发布者和订阅者的脱钩可以允许更大的可扩展性和更动态的网络拓扑。

相关内容

  • 没有找到相关文章

最新更新