2012-03-10 42 views
0

我正在使用node.js和socket.io。我正在使用http-proxy在運行apache的計算機上使用端口80。 Apache在不同的IP上。這一切都很好。Node.js,Socket.io,Http-Proxy,集羣,Express - 斷開連接時握手丟失 - 延遲重新連接

我在Cluster中添加了一些東西,它變得很時髦。它按預期產生兩名工作人員(雙核虛擬機)。但客戶端的連接已關閉。有時候它是好的,那麼如果你斷開連接,就會有重新連接的延遲(沒有沒有羣集的情況下)。

下面是我有的代碼..任何想法爲什麼在使用羣集斷開和連接之間存在延遲?

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

您需要在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)) 
0

作爲RBRC,你需要在你的工人不同socket.io服務器進行通信和共享數據的一些方法,否則當您連接到一個,然後其他的,他們不能知道你已經有會議。這也適用於快速'會議,我看你在那裏使用RedisStore。既然你已經依賴於redis,socketio.RedisStore看起來很不錯,否則你可以試試socket.io-clusterhub

相關問題