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 環境構築プロセスの図

推薦する

Gojs がアリのラインアニメーション効果を実装

目次1. Gojsの実装1. 描画2. 破線の実装3. 点線を動かす2. 点線と点線アニメーションの...

Vue3のいくつかの利点についての簡単な説明

目次1. ソースコード1.1 モノレポ1.2 タイプスクリプト2. パフォーマンス2.1 ソースコー...

njs モジュールを使用して nginx 構成に js スクリプトを導入する

目次序文1. NJSモジュールをインストールする方法1: NJSモジュールを動的にロードする方法2:...

IEの送信フォームの記録履歴クリックリターン情報を実現するためのCSSスタイルコントロールはまだ残っています

これは主に CSS スタイルのコントロールと META タグです。コードをコピーコードは次のとおりで...

CSS はモバイル互換性の問題を解決するために 0.5px の線を実装します (推奨)

【コンテンツ】: 1.背景画像のグラデーションスタイルを使用する2. スケールを使ってズームできる...

Ajax の JavaScript ソリューションにおける parsererror エラー ケースの詳細な説明

ajax の parsererror エラー (バックグラウンドからフロントエンドに送信される js...

Javascriptでオブザーバーモードを実装する方法を教えます

目次オブザーバーパターンとは何ですか?シナリオシミュレーションコードの実装コードのリファクタリング要...

Mac MySQL のルートパスワードをリセットするチュートリアル

免責事項:このパスワード リセット方法は、Homebrew によってインストールされた MySQL ...

DOCTYPE 文書型宣言 (Web ページ愛好家必読)

DOCTYPE 宣言 作成するすべてのページの先頭に、ドキュメント宣言が必要です。はい、そうでしょう...

テキストエリアのテキストをHTMLに変換する方法、つまり復帰改行について

説明: テキストエリアの値の改行を新しい行に変更しますコードをコピーコードは次のとおりです。 <...

Ubuntu 20.04 CUDA & cuDNN のインストール方法 (グラフィカル チュートリアル)

CUDA インストール cuda をダウンロードサポートされているcudaバージョンを表示するには...

HTML+CSS+JavaScript でガールフレンド版のスクラッチ カードを作成します (一度見ればすぐに覚えられます)

誰もがスクラッチ チケットで遊んだことがあると思います。子供の頃、ポケットにお金が入るとすぐに友達に...

Vueはページに透かし効果を追加する機能を実装します

最近、あるプロジェクトに取り組んでいたとき、ページに透かし効果を追加するように依頼されました。さっそ...

Vue+Openlayer で select を使用して要素を選択する実装コード

効果画像: 実装コード: <テンプレート> <div id="map&q...

Node.jsはブレークポイント再開を実装する

目次ソリューション分析スライス履歴書のダウンロード具体的な解決プロセス論理的分析フロントエンドサーバ...