socket.io 广播功能 & Redis pub/sub 架构

Posted

技术标签:

【中文标题】socket.io 广播功能 & Redis pub/sub 架构【英文标题】:socket.io broadcast function & Redis pub/sub architecture 【发布时间】:2012-06-08 11:40:51 【问题描述】:

如果有人能帮助我解决一个小问题,我将不胜感激。

在 Redis 上使用 socket.io 广播功能和使用 pub/sub 设计架构有什么区别?。

例如,在另一个示例中,node.js 服务器正在侦听 (socket.io) CRUD 请求(创建)“键”(模型“todo”)和值“数据”。当它接收到它时,它会再次向同一个用户发射,并向所有在同一个“频道”上收听的用户广播。

socket.on('todo:create', function (data, callback) 
    var id = guid.gen()
      , todo = db.set('/todo/' + id, data)
      , json = todo._attributes;

    socket.emit('todos:create', json);
    socket.broadcast.emit('todos:create', json);
    callback(null, json);
);

但是还有另一种使用 socket.io 来“广播”某些东西的方式,并且是使用带有 Redis 的发布/订阅平台来实现键:值功能。例如,在进一步的情况下,我们正在侦听基于“键”(模型)、函数(创建)和值(数据)的 CRUD 请求。但是在这种情况下,一旦收到,就不会通过“socket.broadcast.emit()”发送,而是在 Redis 上发布:

socket.on(key + ':create', function (data, callback) 
  var t = new ModelClass(data)
    , name = '/' + key + ':create';
  t.save(function (err) 
    pub.publish(key, JSON.stringify(key: name, data: t));
  );
);

所以在服务器端,对模型所做的每一个更改(并发布到 Redis)都将被赶上(处理程序),并发送到用户客户端(在我的情况下,backbone.js),这将呈现它的模型根据收到的键:值:

sio.on('connection', function (socket) 

   sub.on('message', function (channel, message) 
      var msg = JSON.parse(message);
      if (msg && msg.key) 
          socket.emit(msg.key, msg.data);
      
);

所以我的问题很简单 :-) :两种架构的区别是什么?哪一个更具可扩展性?更好的设计?模式推进?

在我看来,pub/sub 架构适用于自然不支持“实时”的平台,例如 Ruby,与原生支持它的 Node.js 不同。。我错了吗?

【问题讨论】:

嘿@user1106811!您应该将答案标记为已接受。谢谢 【参考方案1】:

Socket.io 的广播方法将广播到所有连接到当前 Node.js 服务器的套接字,但是如果您的应用程序变得流行并且您需要多个服务器来托管所有 socket.io 连接怎么办?使用 Redis 的 Pub/Sub,您的消息可以一次分发到多个服务器。

【讨论】:

【参考方案2】:

您可能想看看 Socket.io 中的 RedisStore。您可以将 socket.io 设置为使用 RedisStore,而不是使用 MemoryStore。以便您可以扩展您的应用程序。

http://www.ranu.com.ar/2011/11/redisstore-and-rooms-with-socketio.html

正如这里 (https://***.com/a/9275798/327004) 所述,将 Socket.io 与 RedisStore 一起使用可能会导致会话出现一些问题,因为会话不会在工作人员之间共享。

【讨论】:

以上是关于socket.io 广播功能 & Redis pub/sub 架构的主要内容,如果未能解决你的问题,请参考以下文章

socket io 广播、房间和确认功能

socket.io:关于广播和最大连接的查询

socket.io - 如何在命名空间上广播消息?

Socket.io 广播到房间不工作

socket.io:为啥这个广播语句不起作用?

Socket.io广播到房间不工作