2017-04-07 3 views
0

私は複数のCPUコア(私の場合は4)から利益を得るためにnode.jsでクラスタモジュールを使用しています。問題は、作業者がビジー状態の場合、約10秒後に次の要求が別の使用可能な作業者に委任され、これは受け入れられないことです。次のように私は、クラスタをテストするために無限ループを使用しています:ノードjs - 要求を委譲する前のクラスタ遅延

var cluster = require ('cluster'); 

if (cluster.isMaster) { 
    var cpuCount = require('os').cpus().length; 
    for (var i = 0; i < cpuCount-1; ++i) { 
     cluster.fork(); 
    } 
} else { 
    var express = require('express'); 
    var app = express(); 

    app.get('/', function (req, res) { 
     console.log('Served by worker %d!', cluster.worker.id); 
     while(true) {} 
     console.log("done"); 
     res.status(200).send(); 
    }); 

    app.listen(8080, function() { 
     console.log('Worker %d running!', cluster.worker.id); 
    }); 
} 

cluster.on('exit', function (worker) { 
    console.log('Worker %d died :(', worker.id); 
    cluster.fork(); 
}); 

最初に私はlocalhostを開く:ブラウザで8080を、メッセージをログ「作業員1で役立った」瞬時に印刷されています。その後、同じページを新しいタブで開き、10秒後に「Served by worker 2」が表示されます。これはなぜですか?また、リクエストをすぐに利用可能なワーカーに委譲するにはどうすればよいですか?

+0

「クラスタ」は、マスタープロセスと子プロセスが互いに通信できるようにすることです。無限ループで子プロセスを完全にブロックしている場合、その通信は事実上ブロックされています。 – robertklep

答えて

0

どのコアがload-balancerメソッドを実行していますか?他のアプリにリクエストを送信する無限ループのため、バランサが多忙である可能性があります。実際に

for..loopが同期動作し、load-balancer方法はloopと同じアプリとコアである場合inifiniteループがある場合、ロード・バランサの動作はありません。

クラスタを作成する場合は、PM2を使用することを強くお勧めします。長年にわたって開発されてきた図書館は、あなたの期待をはるかに上回ります。

幸運..

+0

アドバイスをいただきありがとうございます!ただし、pm2はAGPLの下でライセンスされています。これは商用ソフトウェアにいくつかの制限を課しますか?私は一般に、MIT/BSDライセンスライブラリを好む。 – eko

関連する問題