Redis的发布 - 订阅或Socket.IO的广播(Redis Pub-Sub or Socket

2019-06-23 16:02发布

我看到这个片段:

在服务器

io.sockets.on('connection', function(socket) {
  const subscribe = redis.createClient();
  const publish = redis.createClient();

  socket.on('publish', function(channel, data) {
    publish.publish(channel, data);
  });

  socket.on('psubscribe', function(channel) {
    subscribe.psubscribe(channel);
  });

  subscribe.on("pmessage", function(pattern, channel, message) {
    socket.emit('message', { channel: channel, data: message });
  });
});

在客户端

$(".action").click(function() {
  socket.emit('publish', 'game.#{gameid}.action.' + $(this).data('action'),
  JSON.stringify({ nick: "#{nick}", ts: Date.now() })
);

我想知道为什么吗? 不Socket.IO拥有自己的广播机制? 为什么选择Redis的发布 - 订阅过Socket.IO? 难道我们不能这样做:

io.sockets.on('connection', function(socket) {
  socket.on('action', function(channel, data) {
    socket.broadcast.to(channel).emit(data)
  });
});

而如果有一个理由使用Redis的,会有什么好处? 持久性?

Answer 1:

我之所以选择在我的实时活动流项目中使用Redis的酒吧子与Socket.io( http://blog.cloudfoundry.com/2012/06/05/node-activity-streams-app-2/ )是因为我想有多个Web服务器(上在Heroku上的Cloud Foundry或DYNOS实例)。 至于我可以看到,Socket.io存储在(一个web服务器),存储的信息,因此它可以怎么可能播出,其连接到另一个网站服务器的客户端?

退房后 ,让我知道,如果有帮助



Answer 2:

Redis的用在这里至少有两个原因。 第一个是,它的作品真的以及发布和订阅机制,包括能够基于模式匹配psubscribe选择的消息。 第二个原因是便于其他客户端才能够发布,并通过Redis的机构认购。 这并不是说这是不可能的,只是方便。 这与node.js的的asynchronisity相结合,使得一个强大的合作伙伴关系。

这当然不是只有一个唯一的解决方案,似乎工作相当出色。



文章来源: Redis Pub-Sub or Socket.IO's broadcast