Using cluster module with HTTP servers をgoogle翻訳します。

Using cluster module with HTTP servers(HTTPサーバーでのクラスタモジュールの使用)

クラスタモジュールは、マルチコアCPUシステムにおけるアプリケーションのパフォーマンスを向上させます。これは、APIまたはExpressJSベースのWebサーバーで作業している場合でも、NodeJSアプリケーションが実行されている各マシンのすべてのCPUを利用することが重要です。

クラスタモジュールを使用すると、着信要求を一連のワーカープロセス間で負荷分散することができます。そのため、アプリケーションのスループットが向上します。

前回の記事では、NodeJSクラスターモジュールについて理解しました。クラスターモジュールを紹介し、クラスターモジュールの基本的な使い方を示して、ワーカープロセスを作成し、マスタープロセスとコミニケーションさせました。この記事では、プレーンなHTTPモジュールとExpressJSの両方を使用して、HTTPサーバーを作成するときにクラスター・モジュールを使用する方法を見ていきます。

このシリーズの詳細

  1. Understanding the NodeJS cluster module
  2. Using cluster module with HTTP servers
  3. Using PM2 to manage a NodeJS cluster
  4. Graceful shutdown NodeJS HTTP server when using PM2

Using cluster module with HTTP servers(HTTPサーバーでのクラスタモジュールの使用)

クラスタモジュールの利益を得る本当に基本的なHTTPサーバをどのように作成できるかを見てみましょう。

const cluster = require('cluster');  
const http = require('http');  
const numCPUs = require('os').cpus().length;  

if (cluster.isMaster) {  
  masterProcess();  
} else {  
  childProcess();    
}  

function masterProcess() {  
  console.log(`Master ${process.pid} is running`);  

  for (let i = 0; i < numCPUs; i++) {  
    console.log(`Forking process number ${i}...`);  
    cluster.fork();  
  }  
}  

function childProcess() {  
  console.log(`Worker ${process.pid} started...`);  

  http.createServer((req, res) => {  
    res.writeHead(200);  
    res.end('Hello World');  
  }).listen(3000);  
}  

コードを2つの部分に分割しました.1つはマスタープロセスに対応し、もう1つはワーカープロセスを初期化します。このようにして、masterProcess関数はCPUコードごとにワーカープロセスをフォークします。一方、childProcessは、ポート3000でlistenし、200のステータスコードを持つ素敵なHello Worldテキスト文字列を返すだけのHTTPサーバを作成します。

コードを実行すると、出力は次のように表示されます。

$ node app.js  

Master 1859 is running  
Forking process number 0...  
Forking process number 1...  
Forking process number 2...  
Forking process number 3...  
Worker 1860 started...  
Worker 1862 started...  
Worker 1863 started...  
Worker 1861 started...  

基本的に私たちの初期プロセス(マスター)は、要求を処理するHTTPサーバーを実行するCPUごとに新しいワーカープロセスを生成しています。ご覧のように、100万回のリクエストに4つのプロセスで処理するのと、100万回のリクエストに1つのプロセスで処理を要することは同じではないので、サーバーのパフォーマンスを大幅に向上させることができます。

How cluster module works with network connections ?(クラスタモジュールとネットワーク接続の関係)

前の例はシンプルですが、何かトリッキーなものを隠しています。いくつかの魔法のNodeJSは、開発者としてのライブを簡素化するためのものです。

どのOSでも、プロセスはポートを使用して他のシステムと通信することができます。つまり、指定されたポートはそのプロセスでのみ使用できます。だから、問題はフォークされたワーカープロセスがどのようにして同じポートを使用できるのでしょうか?

マスター・プロセスは、指定されたポートで待機し、すべての子/ワーカー・プロセス間でリクエストをロード・バランシングします。公式文書から

ワーカープロセスはchild_process.fork()メソッドを使用して生成されるため、IPC経由で親プロセスと通信し、サーバーハンドルを前後に渡すことができます。
クラスタモジュールは、着信接続を分散する2つの方法をサポートしています。

  • 最初のもの(およびWindows以外のすべてのプラットフォームのデフォルトのもの)はラウンドロビン方式で、マスタープロセスはポートをリッスンし、新しい接続を受け取り、ラウンドロビン方式でワーカーに配布します。ワーカープロセスのオーバーロードを避けるために、いくつかのスマートを内蔵しています。
  • 2番目のアプローチは、マスタプロセスが待機ソケットを作成し、それを関心のあるワーカーに送信する方法です。ワーカーは着信接続を直接受け入れます。

まだ生きているワーカーがいれば、サーバーは引き続き接続を受け入れます。ワーカーが生存していない場合、既存の接続は削除され、新しい接続は拒否されます。

Other alternatives to cluster module load balancing(クラスタモジュールのロードバランシングのその他の代替方法)

クラスタモジュールを使用すると、マスタプロセスは要求を受信し、すべてのワーカープロセス間で負荷分散を行うことができます。これはパフォーマンスを改善する方法ですが、それだけではありません。

Node.jsは負荷バランスの処理を処理する:クラスタモジュール、iptablesとNginxを比較するでノードクラスタモジュール、iptables、nginxリバースプロキシの間でパフォーマンスの比較を見つけることができます。

Conclusions(結論)

今日のパフォーマンスはあらゆるWebアプリケーションで必須です。高いスループットをサポートし、データを高速に処理する必要があります。

クラスタモジュールは1つの可能なソリューションです。これにより、1つのマスタープロセスを持ち、コアごとにワーカープロセスを作成し、HTTPサーバーを実行できます。クラスタモジュールには2つの大きな機能があります。

  • IPCチャネルを作成し、process.send()でメッセージを送信することによって、マスタとワーカー間の通信を意味します。
  • ワーカープロセスが同じポートを共有できるようにします。これは、マスタプロセスが要求を受け取り、それらをワーカーの間で多重化するプロセスにすることで行われます。