簡體   English   中英

Node.js,Socket.io,Http-Proxy,Cluster,Express - 握手連接斷開 - 重新連接延遲

[英]Node.js,Socket.io,Http-Proxy,Cluster,Express - Handshake drops on disconnect - delay in reconnect

我正在使用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);
            });       
    });

}

您需要添加一個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))

作為rbrc,你需要一些方法讓你的worker中的不同socket.io服務器進行通信和共享數據,否則當你連接到一個然后連接另一個時,他們就不知道你已經有了一個會話。 這也適用於快速會話,我看到你RedisStore那里使用RedisStore 由於你已經依賴redis, socketio.RedisStore似乎很合適,否則你可以試試socket.io-clusterhub

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM