socket.io广播功能和Redis发布/订阅架构

8

我希望有人能帮我解决一个小问题。

使用socket.io广播功能和使用Redis的发布/订阅设计架构有什么区别?

例如,对于进一步的示例,node.js服务器正在监听(socket.io)针对“键”(模型'todo')和值'data'的CRUD请求(创建)。在收到它时,它会再次向同一用户发出信号,并向所有正在监听相同“通道”的用户进行广播。

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形成对比。 我错了吗?

2个回答

1

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


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接