微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

如果我有客户端连接到服务器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.io代码,并且仍然会通过它传播到其他socket.io服务器Redis的.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐