socket.io广播功能和Redis发布/子结构

use*_*811 7 architecture redis socket.io

如果有人可以帮我解决一个小问题,我将不胜感激.

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

例如,在另一个示例中,node.js服务器正在侦听(socket.io)CRUD请求(创建)"key"(模型"todo")和值"data".它收到它的那一刻,它再次发送给同一个用户,并广播给在同一个"频道"上收听的所有用户.

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);
});
Run Code Online (Sandbox Code Playgroud)

但是还有另一种使用socket.io"广播"某种东西的方法,并且正在使用带有Redis的pub/sub平台来实现key:value函数.例如,在另一种情况下,我们正在监听基于"密钥"(模型),函数(创建)和值(数据)的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}));
  });
});
Run Code Online (Sandbox Code Playgroud)

因此,在服务器端,对模型进行的每个更改(并发布到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);
      }
});
Run Code Online (Sandbox Code Playgroud)

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

在我看来,pub/sub体系结构适用于不支持"实时"的平台,如Ruby,与Node.js相比,它本身支持它..我错了吗?

Jes*_*ugh 1

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