2016-08-11 6 views
1

Socket.IOを持つノードサーバーがNginxの背後にあります。私はそれをNginxとロードバランシングしています。複数のCPUコアを活用できますか?

function server(port){ 
    const http = require(`http`).createServer((req, res) => { 
    // http stuff ... 
    }.listen(port) 

    const io = require(`socket.io`)(http) 
    // socket stuff ... 
} 

server(2000) 
server(3000) 
server(4000) 
server(5000) 

ないノードが異なるコア上でこれらのポートのそれぞれを実行するか、まさに私は:私のノードサーバは、次のように設定されている

upstream nodes { 
    ip_hash; 

    server localhost:2000; 
    server localhost:3000; 
    server localhost:4000; 
    server localhost:5000; 
} 

:クライアントは、これらのポートのいずれかに向けられていますここでの負荷分散?

ソケットコードがサーバー機能の内部または外部に移動する必要がありますか?

答えて

0

いいえ、通常、複数のコアを大幅に活用することはありません。 node.jsはほとんどがシングルスレッドです。同じnode.jsプロセス内の5つのサーバーをすべて起動しても、余分なコアを使用できるスレッドまたはプロセスはもうありません。ポート2000サーバーが要求を処理するコードを実行している場合、他のどのサーバーもコードを同時に実行することはできません。ポート2000サーバーが1つのnode.jsスレッドに制御を戻すまで待ち​​ます。次に、別のサーバーが要求を取得して実行を開始し、他のすべてのサーバーが要求を待機する必要があります。あなたが興味があるかもしれない何

は、実際には(すべて同じことをやって)複数のNode.jsプロセスを開始し、その後、リクエストが異なるプロセスに配布されるクラスタリングモジュールです。このタイプのクラスタリングを使用するにはnginxは必要ありません。クラスタリングモジュールはnode.jsソフトウェアを使用してクラスタリングを行います。 1つのサーバーリスナーがあり、着信要求がさまざまなクラスター化されたプロセスに配信されます。

あなたは、クラスタリングが機能するのNode.jsについて説明非常に良いブログ記事を参照するなど、以前の今日からこの他の回答でそれについての詳細を読むことができます:

Node: one core, many processes

あなた自身がドンながら」 1つのコア、多くのプロセスが必要な場合は、多くのアーキテクチャ上の問題がその問題で取り上げられています。

5

投稿したコードは、1つのCPUコアで4つのポートを提供する1つのサーバーを実行します。

おそらく4つの別個のサーバーを、わずかな変更で4つのコアに実行できます。コマンドライン引数としてポートを渡す:

function server(port){ 
    const http = require(`http`).createServer((req, res) => { 
    // http stuff ... 
    }.listen(port) 

    const io = require(`socket.io`)(http) 
    // socket stuff ... 
} 

server(process.argv[2]) 

次に、それらを開始します。

node index.js 2000 & 
node index.js 3000 & 
node index.js 4000 & 
node index.js 5000 & 

注:Node.jsのは実際には組み込みのクラスタリング機能を持っています。クラスタリングを詳しく調べたい場合は、ドキュメントをお読みください。https://nodejs.org/api/cluster.html

関連する問題