2016-08-07 13 views
0

セットアップした小さなサンドボックスでサーバーをスケールする方法を学習しています。ただ、nodejs pm2を使用してサーバーをスケーリングするときのポートの動作

'use strict'; 

const express = require('express'); 
const bodyParser = require('body-parser'); 
const app = express(); 

const instanceId = parseInt(Math.random() * 1000); 

//Allow all requests from all domains & localhost 
app.all('/*', function(req, res, next) { 
    res.header("Access-Control-Allow-Origin", "*"); 
    res.header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Accept"); 
    res.header("Access-Control-Allow-Methods", "POST, GET"); 
    next(); 
}); 

app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({extended: false})); 

app.get('/', function(req, res) { 
    console.log(`[${new Date()}] ${req.method} ${req.originalUrl} from ${req.ip} at ${instanceId}`); 
    res.send(`received at ${Date.now()} from ${instanceId}`); 
}); 

app.listen(6069); 

何も狂った日付と要求がで受信されたインスタンスを吐き出す:ここでは非常に簡単なコードです。 nodejsサーバーをスケーリングする

PM2ドキュメントを実行するために私に助言:

完璧にうまく働いた
pm2 start server.js -i 5 

。ここでは、npmモジュールのloadtestを使用して負荷テストを行った場合の出力例を示します。

server-0 [Sun Aug 07 2016 00:13:53 GMT-0400 (EDT)] GET/from ::ffff:127.0.0.1 at 847 
server-1 [Sun Aug 07 2016 00:13:53 GMT-0400 (EDT)] GET/from ::ffff:127.0.0.1 at 261 
server-3 [Sun Aug 07 2016 00:13:53 GMT-0400 (EDT)] GET/from ::ffff:127.0.0.1 at 328 
server-2 [Sun Aug 07 2016 00:13:53 GMT-0400 (EDT)] GET/from ::ffff:127.0.0.1 at 163 
server-4 [Sun Aug 07 2016 00:13:53 GMT-0400 (EDT)] GET/from ::ffff:127.0.0.1 at 351 
server-0 [Sun Aug 07 2016 00:13:53 GMT-0400 (EDT)] GET/from ::ffff:127.0.0.1 at 847 
server-3 [Sun Aug 07 2016 00:13:53 GMT-0400 (EDT)] GET/from ::ffff:127.0.0.1 at 328 
server-1 [Sun Aug 07 2016 00:13:53 GMT-0400 (EDT)] GET/from ::ffff:127.0.0.1 at 261 
server-2 [Sun Aug 07 2016 00:13:53 GMT-0400 (EDT)] GET/from ::ffff:127.0.0.1 at 163 
server-4 [Sun Aug 07 2016 00:13:53 GMT-0400 (EDT)] GET/from ::ffff:127.0.0.1 at 351 
server-0 [Sun Aug 07 2016 00:13:53 GMT-0400 (EDT)] GET/from ::ffff:127.0.0.1 at 847 
server-3 [Sun Aug 07 2016 00:13:53 GMT-0400 (EDT)] GET/from ::ffff:127.0.0.1 at 328 

ここに私の質問があります。ポート6069が使用されているというエラーがノードで発生しなかったのはなぜですか?複数のサーバーがポートを使用しようとしていますが、不平はありません。どうして?

答えて

2

PM2は独自の「組み込みロードバランサ」を作成し、ラウンドロビンアルゴリズムを使用して作業者間で負荷を分散します。つまり、基本的には、アプリケーションの周りにロードバランサをラップし、それが作成する各ノードにリクエストをプロキシします。

ラウンドロビンスケジューリング・ポリシーを使用して、マスターは()すべての 着信接続を受け入れ、( IPCを経由して)選択した労働者に対して、特定の 接続のためのTCPハンドルを送信します。

+0

本当に 'app.listen(6069)'では何が起こっていますか?なぜポート衝突がないのですか? – helsont

+0

ノードのクラスタモジュールを使用して複数の作業者にフォークするためです。一般に、CPUが 'require( 'os')で利用できるよりも多くの労働者を使うべきではないことに注意してください。 Node.jsクラスターの詳細はこちら:https://nodejs.org/api/cluster.html – ldg

+0

ありがとうございました。私はそこにあなたのコメントの行に沿って何かを探していました。この質問は、http://stackoverflow.com/questions/1568786/fork-before-or-after-accepting-connectionsを明確にするのにも役立ちました。基本的に、特定のポートで 'accept'の前に' fork'を呼び出すのはまったく問題ありません。 – helsont

関連する問題