Масштабирование socket.io между серверами

Какие существуют подходы к масштабированию приложений socket.io? Я вижу следующую проблему, которую не понимаю, как решить:

  • Как масштабированное приложение socket.io может транслировать в комнату? Другими словами, как socket.io узнает о соседях с других серверов?

Мне трудно представить, как это должно работать — может быть, общий вариант хранилища для всей необходимой информации, такой как Redis — это возможно?

РЕДАКТИРОВАТЬ: я нашел эту статью: http://www.ranu.com.ar/2011/11/redisstore-and-rooms-with-socketio.html

На ее основе я сделал следующее :

   var pub = redis.createClient();  
   var sub = redis.createClient();
   var store = redis.createClient();
   pub.auth("pass");
   sub.auth("pass");
   store.auth("pass");

    io.configure( function(){
io.enable('browser client minification');  // send minified client
io.enable('browser client etag');          // apply etag caching logic based on version number
    io.enable('browser client gzip');          // gzip the file
io.set('log level', 1);                    // reduce logging
io.set('transports', [                     // enable all transports (optional if you want flashsocket)
    'websocket'
  , 'flashsocket'
  , 'htmlfile'
  , 'xhr-polling'
  , 'jsonp-polling'
]);
var RedisStore = require('socket.io/lib/stores/redis');
io.set('store', new RedisStore({redisPub:pub, redisSub:sub, redisClient:store}));
    });

Но я получаю следующую ошибку:

      Error: Uncaught, unspecified 'error' event.
     at RedisClient.emit (events.js:50:15)
     at Command.callback (/home/qwe/chat/io2/node_modules/socket.io/node_modules/redis/index.js:232:29)
     at RedisClient.return_error (/home/qwe/chat/io2/node_modules/socket.io/node_modules/redis/index.js:382:25)
     at RedisReplyParser. (/home/qwe/chat/io2/node_modules/socket.io/node_modules/redis/index.js:78:14)
     at RedisReplyParser.emit (events.js:67:17)
     at RedisReplyParser.send_error (    /home/qwe/chat/io2/node_modules/socket.io/node_modules/redis/lib/parser/javascript.js:265:14)
     at RedisReplyParser.execute (/home/qwe/chat/io2/node_modules/socket.io/node_modules/redis/lib/parser/javascript.js:124:22)
     at RedisClient.on_data (/home/qwe/chat/io2/node_modules/socket.io/node_modules/redis/index.js:358:27)
     at Socket. (/home/qwe/chat/io2/node_modules/socket.io/node_modules/redis/index.js:93:14)
     at Socket.emit (events.js:67:17)

Мои учетные данные Redis определенно верны.

РЕДАКТИРОВАТЬ: Очень странно, но с отключенной авторизацией Redis все работает. Так что вопрос по-прежнему актуален. Дополнительно у меня есть вопрос, как получить информацию (например имя пользователя) для всех участников группы (комнаты) в этом режиме RedisStorage, возможно ли это реализовать? В идеале это можно сделать с помощью функции Redis Pub/Sub.

6
задан Daniel Mendel 27 May 2012 в 21:26
поделиться