Node.js, Socket.io, Http-Proxy, Cluster, Express - рукопожатие сбрасывается при отключении - задержка при повторном подключении - PullRequest
0 голосов
/ 10 марта 2012

Я использую node.js и socket.io. Я использую http-прокси, чтобы использовать порт 80 на машине, на которой также работает apache. Apache находится на другом IP. Все это прекрасно работает.

Я добавил в кластер, и все стало весело. Он порождает двух рабочих (двухъядерный VM), как и ожидалось. Но соединение на стороне клиента отключено. Иногда это хорошо, тогда, если вы отключаетесь, возникает задержка повторного подключения (не было без Кластера).

Вот код, который у меня есть ... есть идеи, почему существует задержка между отключением и подключением с помощью кластера?

var http          = require('http'),
    httpProxy     = require('http-proxy'),
    io            = require('socket.io'),
    cluster       = require('cluster'),
    express       = require('express'),
    RedisStore    = require('connect-redis')(express);


var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {

      //Fork workers.
      for (var i = 0; i < numCPUs; i++) {
        cluster.fork();
      }

      cluster.on('death', function(worker) {
        console.log('worker ' + worker.pid + ' died');
      });

} else {


    //Server for workers
    var app = express.createServer().listen(8585, '172.16.183.129');
    app.configure(function(){
          app.use(express.bodyParser());
          app.use(express.methodOverride());
          app.use(express.cookieParser());
          app.use(express.session({ secret: "secret", store: new RedisStore}));
          app.use(app.router);
          app.use(express.errorHandler({showStack: false, dumpExceptions: false}));
          app.use(express.static(__dirname + '/public'));
    });


    //Create proxy server to use port 80
    var proxy = httpProxy.createServer(8585, '172.16.183.129');
    proxy.listen(80, '172.16.183.129');

    //Initilize socket.io
    var io = require('socket.io').listen(app, {origins: '*:*'});    


    io.sockets.on('connection', function(socket){


          var test = setInterval(function() {
              socket.emit('test', { result: numCPUs}); 
              i++;
          }, 900);


          socket.on('disconnect', function () {
                console.log('disconnect');
                clearInterval(auctionTimer);
            });       
    });

}

Ответы [ 2 ]

2 голосов
/ 13 марта 2012

Вам необходимо добавить RedisStore, чтобы работники сокетов могли работать вместе.Обратите внимание, что в последней версии socket.io есть встроенный RedisStore, который вы, вероятно, должны использовать вместо соединения с redis.

socketio = require('socket.io')

var io = socketio.listen(app, {origins: '*:*'}); 

var host = 'redisserver'
var opts = {redisSub:{host:host},redisPub:{host:host},redisClient:{host:host}}
io.set('store', new socketio.RedisStore(opts))
0 голосов
/ 16 марта 2012

Как rbrc, вам нужен какой-то метод для различных серверов socket.io ваших сотрудников для обмена данными и обмена ими, иначе, когда вы подключаетесь к одному, а затем к другому, они не могут знать, что у вас уже есть сеанс. Это касается и экспресс-сессий, и я вижу, что вы используете RedisStore там. Так как у вас уже есть зависимость от Redis, socketio.RedisStore кажется подходящим, в противном случае вы можете попробовать socket.io-clusterhub .

...