16

我看到了这个片段:

在服务器上

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 的 Pub-Sub 而不是 Socket.IO?我们不能这样做:

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

如果有理由使用 Redis,会有什么好处?坚持?

4

2 回答 2

16

我选择在我的实时活动流项目(http://blog.cloudfoundry.com/2012/06/05/node-activity-streams-app-2/)中使用带有 Socket.io 的 Redis Pub Sub 的原因是因为我想拥有多个 Web 服务器(Cloud Foundry 上的实例或 Heroku 上的 dynos)。据我所知,Socket.io 将消息存储在(一个网络服务器的)内存中,那么它怎么可能广播到连接到另一个网络服务器的客户端呢?

查看帖子,让我知道是否有帮助

于 2012-10-21T19:21:53.030 回答
2

在这里使用 Redis 至少有两个原因。第一个是它作为发布和订阅机制工作得非常好,包括能够根据模式匹配选择消息到 psubscribe。第二个原因是其他客户端能够通过redis机制轻松发布和订阅。这并不是说不可能,只是方便。这与 node.js 的异步性相结合,形成了强大的合作伙伴关系。

当然,这不是唯一的解决方案,但似乎效果很好。

于 2012-06-15T06:49:07.533 回答