Node.js でのクラスター作成に関する簡単な説明

Node.js でのクラスター作成に関する簡単な説明

クラスタ

Node.js のイベント ループやイベント レスポンス プロセッサはシングル スレッドであることはわかっていますが、最近の CPU は基本的にマルチコアです。最新の CPU のマルチコア特性を最大限に活用するには、複数の子プロセスが同じサーバー ポートを共有できるようにクラスターを作成します。

つまり、クラスターを通じて、複数の子プロセスを使用して同じポートの要求を処理できます。

http サーバーでクラスターを使用する簡単な例を見てみましょう。

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

クラスタがマスターの場合
  console.log(`メインプロセス ${process.pid} が実行中です`);

  // ワーカープロセスを生成します。
  (i = 0; i < numCPUs; i++) の場合 {
    クラスターをフォークします。
  }

  cluster.on('exit', (ワーカー、コード、シグナル) => {
    console.log(`ワーカープロセス ${worker.process.pid} が終了しました`);
  });
} それ以外 {
  // ワーカープロセスは任意の TCP 接続を共有できます。
  // この例では、HTTP サーバーが共有されます。
  http.createServer((req, res) => {
    書き込みヘッドを200にします。
    res.end('Hello World\n');
  }).listen(8000);

  console.log(`ワーカープロセス ${process.pid} が開始されました`);
}

クラスターの詳細

クラスター モジュールは lib/cluster.js から派生しています。cluster.fork() を使用して、メイン プロセスからのリクエストを処理する子ワーカー プロセスを作成できます。

クラスター内のイベント

クラスターは events.EventEmitter を継承するため、クラスターはイベントを送受信できます。

クラスターは、切断、終了、フォーク、リスニング、メッセージ、オンライン、セットアップの 7 つのイベントをサポートします。

切断について説明する前に、まず IPC という概念を紹介します。IPC の正式名称は Inter-Process Communication で、プロセス間通信を意味します。

IPC は主にメインプロセスとサブプロセス間の通信に使用されます。ワーカー プロセスは、作成後に自動的にマスター プロセスに接続します。 「disconnect」イベントが発行されると、接続は切断されます。

切断イベントをトリガーする理由は多数ありますが、worker.disconnect() へのアクティブな呼び出しや、ワーカー プロセスの終了または強制終了などが考えられます。

cluster.on('切断', (ワーカー) => {
  console.log(`ワーカープロセス #${worker.id} が切断されました`);
});

いずれかのワーカー プロセスが閉じられると、終了イベントがトリガーされます。これは通常、クラスター内のプロセスが異常終了するかどうかを監視するために使用されます。プロセスが終了した場合は、cluster.fork を使用して新しいプロセスを作成し、リクエストを処理するのに十分なプロセスがあることを確認します。

cluster.on('exit', (ワーカー、コード、シグナル) => {
  console.log('作業プロセス %d が終了しました (%s)。再起動しています...',
              worker.process.pid、シグナル || コード);
  クラスターをフォークします。
});

cluster.fork メソッドが呼び出されると、フォーク イベントがトリガーされます。

const タイムアウト = [];
関数 errorMsg() {
  console.error('接続エラー');
}

cluster.on('fork', (ワーカー) => {
  タイムアウト[worker.id] = setTimeout(errorMsg, 2000);
});

ワーカー プロセスが listen メソッドを呼び出すと、メイン プロセスとワーカー プロセスのリスニング イベントがトリガーされます。

cluster.on('listening', (ワーカー, アドレス) => {
  コンソール.log(
    `ワーカープロセスが ${address.address}:${address.port} に接続されました`);
});

Worker は作業スレッドを表し、address には address、port、addressType の 3 つの属性が含まれます。 addressType には 4 つのオプション値があります。

  • 4 (TCPv4)
  • 6 (TCPv6)
  • -1 (Unixドメインソケット)
  • 'udp4' または 'udp6' (UDP v4 または v6)

メインプロセスが子プロセスから送信されたメッセージを受信したときに、メッセージ イベントがトリガーされます。

メインプロセスがワーカープロセスを生成すると、フォークがトリガーされ、ワー​​カープロセスが実行されると、オンラインがトリガーされます。

setupMaster メソッドが呼び出されると、セットアップ イベントがトリガーされます。

クラスター内のメソッド

クラスターには、disconnect、fork、setupMaster という 3 つのメソッドがあります。

cluster.disconnect([コールバック])

クラスターの切断メソッドを呼び出すと、実際にはクラスター内の各ワーカーの切断メソッドが呼び出されます。これにより、ワーカーはメイン プロセスから切断されます。

すべてのワーカーが切断されると、コールバックが実行されます。

クラスター.fork([env])

fork メソッドは、メイン プロセスから新しい子プロセスを作成します。 env は、プロセス環境変数に追加されるキーと値のペアです。

fork はワーカー プロセスを表す cluster.Worker オブジェクトを返します。

最後のメソッドはsetupMasterです。

クラスター.setupMaster([設定])

デフォルトでは、クラスターは fork メソッドを使用して子プロセスを作成しますが、setupMaster を使用してこの動作を変更できます。設定変数を設定することで、後続のフォーク子プロセスの動作を変更できます。

setupMaster の例を見てみましょう。

定数cluster = require('cluster');
クラスター.setupMaster({
  実行: 'worker.js',
  引数: ['--use', 'https'],
  サイレント: 真
});
cluster.fork(); // https ワーカープロセス cluster.setupMaster({
  実行: 'worker.js',
  引数: ['--use', 'http']
});
cluster.fork(); // http ワーカープロセス

クラスター内の属性

クラスター オブジェクトを通じて、isMaster と isWorker を使用して、プロセスがメイン プロセスであるかどうかを判断できます。

現在のワーカー プロセス オブジェクトへの参照は、worker を通じて取得できます。

定数cluster = require('cluster');

クラスタがマスターの場合
  console.log('これがメインプロセスです');
  クラスターをフォークします。
  クラスターをフォークします。
} そうでない場合 (cluster.isWorker) {
  console.log(`これはワーカープロセス#${cluster.worker.id}です`);
}

アクティブなワーカー プロセス オブジェクトをワーカーを通じて走査できます。

// すべてのワーカー プロセスを反復処理します。
関数 eachWorker(コールバック) {
  (cluster.workers 内の定数 id) {
    コールバック(cluster.workers[id]);
  }
}
各ワーカー((ワーカー) => {
  worker.send('すべてのワーカープロセスに通知');
});

各作業者には ID 番号があり、それを使用して作業者の位置を特定します。

クラスター内のワーカー

ワーカー クラスには、ワーカー プロセスに関するすべての共通情報とメソッドが含まれています。 cluster.fork が生成するのはワーカー オブジェクトです。

ワーカー イベントはクラスター イベントと非常によく似ており、切断、エラー、終了、リスニング、メッセージ、オンラインの 6 つのイベントをサポートします。

ワーカーには、id、process、exitedAfterDisconnect の 3 つのプロパティが含まれます。

id はワーカーの一意の識別子です。

ワーカー内のプロセスは、実際には child_process.fork() を通じて作成される ChildProcess オブジェクトです。

プロセスはワーカー内のグローバル変数であるため、ワーカー内で直接プロセスを使用してメッセージを送信できます。

exitedAfterDisconnect は、ワーカー プロセスが .kill() または .disconnect() により終了した場合、値が true になることを意味します。他の手段で終了する場合、戻り値は false になります。ワーカー プロセスがまだ終了していない場合は未定義です。

アクティブな終了かパッシブな終了かを区別するには、worker.exitedAfterDisconnect を使用します。メイン プロセスは、この値に基づいてワーカー プロセスを再生成するかどうかを決定できます。

cluster.on('exit', (ワーカー、コード、シグナル) => {
  ワーカーが切断後に終了した場合 === true の場合 {
    console.log('これは自然終了なので、心配する必要はありません');
  }
});

// ワーカープロセスを終了します。
ワーカーを強制終了する

ワーカーは、send、kill、destroy、disconnect、isConnected、isDead の 6 つのメソッドもサポートします。

ここでは主にメッセージを送信する send メソッドについて説明します。

ワーカー.send(メッセージ[, sendHandle[, オプション]][, コールバック])

send メソッドと child_process の send メソッド パラメータは実際には非常に似ていることがわかります。基本的に、worker.send はマスター プロセスにあり、特定のワーカー プロセスにメッセージを送信します。 ChildProcess.send() と同等です。ワーカー プロセスでは、これによりマスター プロセスにメッセージが送信されます。 process.send() と同等です。

クラスタがマスターの場合
  ワーカーをクラスターにデプロイする
  ワーカー.send('hello');

} そうでない場合 (cluster.isWorker) {
  process.on('メッセージ', (msg) => {
    プロセス.send(メッセージ);
  });
}

上記の例では、メインプロセス内にいる場合は、worker.send を使用してメッセージを送信できます。子プロセスでは、ワーカー内のグローバル変数プロセスを使用してメッセージを送信できます。

要約する

クラスターを使用すると、マルチコア CPU の利点を最大限に活用できます。実際のプロジェクトに適用していただければ幸いです。

上記は、Node.js でクラスターを作成する詳細についての簡単な説明です。Node.js でクラスターを作成する方法の詳細については、123WORDPRESS.COM の他の関連記事をご覧ください。

以下もご興味があるかもしれません:
  • Nodejs のクラスター モジュールで複数のプロセス間でデータを共有する方法
  • Redis クラスタのデータシャーディングメカニズムの原理
  • Redis クラスター グラフィックス
  • Redis クラスターの紹介
  • Node.js のクラスター モジュールの詳細な解釈
  • ノード内のクラスターについての簡単な説明
  • node.js でクラスターを使用するチュートリアル
  • Node.jsはクラスタを使用してマルチプロセスを実装します

<<:  MySQL でストアド プロシージャを作成し、データ テーブルに新しいフィールドを追加する方法の分析

>>:  Windows 10 での Hyperledger Fabric 1.4 環境構築プロセスの図

推薦する

CSSにおけるマージン値と垂直マージンの重なりについて

平行ボックスの余白 (二重余白の重なり) に関する面接の質問: 1 つのボックスに上余白があり、もう...

MySQL InnoDB ストレージエンジンのメモリ管理の詳細な説明

目次ストレージエンジンのメモリ管理データ ページを LRU キューの先頭に置かないのはなぜですか?ダ...

gorm で MySql データベースを操作する方法

1. テーブル内のフィールドの大文字と小文字の区別を設定するgorm クエリを使用する場合、MySQ...

MySQL 5.7.17 のインストールと設定方法のグラフィック チュートリアル (Windows)

1. ソフトウェアをダウンロードする1. MySQL の公式サイトにアクセスし、Oracle アカ...

MySQLでSELECT文が実行される仕組み

目次1. マクロの観点からMySQLを分析する2. SQL ステートメントを実行するには、どの程度の...

MySQLデータベースの数千万件のデータクエリとストレージの詳細な説明

目次百万レベルのデータ処理ソリューションデータストレージ構造設計クエリステートメントの最適化1000...

MySQL DATEDIFF 関数を使用して 2 つの日付間の時間間隔を取得する方法

説明する2 つの日付間の時間間隔を返します。文法DateDiff(間隔、日付1、日付2 [、週の最初...

VMware 15.5 バージョンのインストール Windows_Server_2008_R2 システム チュートリアル図

1. VMware 15.5から新しい仮想マシンを作成する1. VMware を開き、ホームページで...

dockerでpdflatex環境を設定する方法

技術的背景Latex は文書作成、特に記事作成には欠かせないツールであり、必須のテキスト組版ツールで...

MySQL データ型 DECIMAL の詳細な分析

序文:金額の保存など、小数点数を保存し、精度要件がある場合、通常は DECIMAL フィールド タイ...

JavaScript PromiseとAsync/Awaitの詳細な説明

目次概要4つの例例1: 誕生日で説明する約束の基本例2: 数字当てゲーム例3: Web APIから国...

MySQL でテーブルデータをクリアする 2 つの方法とその違い

MySQL でデータを削除するには 2 つの方法があります。切り詰めは大まかな伐採の一種である削除は...

Mysql でサーバーの UUID を変更する方法

問題の原因:スレーブサーバーがクローンマスターサーバーである場合、server-uuidの値は同じで...

丸い角や鋭い角を表現するために、絵の代わりに文字を使用する研究

Google Gmail ページから撮った次のスクリーンショットをご覧ください (同じ場所からスクリ...

Reactフックの仕組み

目次1. React フックと純粋関数2. シンプルなmyUseState 3. myUseStat...