2016-07-25 11 views
0

Socket.ioは、ハンドシェイクを実行してクライアントとの接続を確立するために複数の要求を行っています。クラスタでは、これらの要求が異なるワーカーに届く可能性があり、ハンドシェイクプロトコルが破られます。 私はradisを使用しようとするが、using multiple node servers with socket.ioためsocket.io docに無い成功nodejsのcluster経由のsocket.ioの問題

var cluster = require('cluster'); 
var config = require('./config/environment'); 

if(cluster.isMaster) { 

    var server = require('http').createServer(); 
    var socketio = require('socket.io')(server, { 
    serveClient: (config.env === 'production') ? false : true, 
    path: '/socket.io-client', 
    pingInterval: 25000, 
    pingTimeout: 30000 
    }); 
    var redis = require('socket.io-redis'); 

    socketio.adapter(redis({ host: '127.0.0.1', port: 6379 })); 

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

    for(var i = 0; i < numWorkers; i++) { 
    cluster.fork(); 
    } 
} else { 
    startServer(); 
} 
// Start server 
function startServer() { 
    var express = require('express'); 
    var mongoose = require('mongoose'); 
    var multer = require('multer'); 

// Connect to database 
    mongoose.connect(config.mongo.uri, config.mongo.options); 

// Setup server 
    var app = express(); 

    app.use(multer({ dest: './uploads/'})); 

    var server = require('http').createServer(app); 
    var socketio = require('socket.io')(server, { 
    serveClient: (config.env === 'production') ? false : true, 
    path: '/socket.io-client', 
    pingInterval: 25000, 
    pingTimeout: 30000 
    }); 
    var redis = require('socket.io-redis'); 

    socketio.adapter(redis({ host: '127.0.0.1', port: 6379 })); 

    require('./config/socketio')(socketio); 
    require('./config/express')(app); 
    require('./routes')(app); 

    server.listen(config.port, config.ip, function() { 
    }); 

    // Expose app 
    exports = module.exports = app; 
} 

答えて

0

右で、それはこの言う:あなたは別の 間の接続の負荷を分散することを計画している場合

特定のセッションIDを持つ に関連する要求が、 を起源とするプロセスに接続していることを確認する必要があります。

次に、nginxプロキシを使用してこれを行う方法について説明します。

複数のクラスタ化プロセスをすべて同じマシン上で使用する場合、node.jsクラスタリングで使用できるsticky-session moduleがあります。コードを見ると、スティッキーセッションモジュールはIPアドレスのハッシュを行い、そのハッシュを使用して常に同じクラスタ化されたサーバーインスタンスに割り当てます。

関連する問題