Node.js,Socket.io,Http-Proxy,Cluster,Express - 握手连接断开 - 重新连接延迟

时间:2012-03-10 01:36:53

标签: node.js socket.io cluster-computing

我正在使用node.js和socket.io。我正在使用http-proxy在运行apache的机器上使用端口80。 Apache处于不同的IP上。这一切都很有效。

我添加了Cluster,事情变得很时髦。它按预期产生了两个工作者(双核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 个答案:

答案 0 :(得分:2)

您需要添加一个RedisStore,以便套接字工作者可以一起工作。请注意,最新版本的socket.io有一个内置的RedisStore,您可能应该使用它来代替connect-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))

答案 1 :(得分:0)

作为rbrc,你需要一些方法让你的worker中的不同socket.io服务器进行通信和共享数据,否则当你连接到一个然后连接另一个时,他们就不知道你已经有了一个会话。这适用于快递&#39;会议也是,我看到你在那里使用RedisStore。由于您已经依赖redis,socketio.RedisStore似乎很合适,否则您可以尝试socket.io-clusterhub