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

标签 architecture redis socket.io

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

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

例如,在进一步的示例中,node.js 服务器正在监听 (socket.io) CRUD 请求(创建)“键”(模型“todo”)和值“data”。收到它的那一刻,它会再次发送给同一个用户,并广播给收听同一个“ channel ”的所有用户。

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 不同。。我错了吗?

最佳答案

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

关于architecture - socket.io广播功能& Redis pub/sub架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10880636/

相关文章:

architecture - 错误 ITMS-9000 : "Invalid architecture: Apps that include an app extension and a framework must support arm64

javascript - 透明的谷歌齿轮场景验证

node.js - 在许多用户之间共享 Redis Db

node.js+express+socket.io 与 ipv6?

c# - DI : Associating entities with repository

ios - 使用 OAuth 时保留登录信息

java - 使用 Java 的 AWS ElastiCache Redis

search - 关于多方面搜索软件堆栈的建议

ios - 将 SSL https 与 socket.io 和 swift 一起用于 iOS 应用程序

node.js - NodeJs响应客户端的url请求到另一个