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

2019-09-17 17:59发布

我将不胜感激,如果有人可以帮我一个小疑问。

请告诉我使用socket.io广播功能,并与Redis的发布/订阅设计架构之间的区别?

例如,在又一例子,Node.js的服务器侦听(socket.io)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的平台,支持它本身。 。 我错了吗?

Answer 1:

Socket.io的广播方式将广播给所有连接到当前的Node.js服务器的插槽,但如果你的应用程序变得受欢迎,你需要比一个服务器的更多东西来承载所有socket.io连接? 使用Redis的的pub / sub您的消息可以同时被分发到多台服务器。



Answer 2:

你可能想在Socket.io看看RedisStore。 如果不使用MemoryStore的,你可以设置socket.io使用RedisStore。 这样就可以扩展您的应用程序。

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

这里提到( https://stackoverflow.com/a/9275798/327004 ),使用Socket.io与RedisStore因为会话没有工人之间共享会导致你一些问题会议。



文章来源: socket.io broadcast function & Redis pub/sub architecture