ホームページ > 記事 > ウェブフロントエンド > PM2 を使用して Node.js クラスタリングを簡単にする方法
ご存知のとおり、Node.js は Chrome の JavaScript ランタイム プラットフォーム (上品に V8 エンジンと呼ばれています) 上で実行されます。 V8 エンジンとそれ以降の Node.js はどちらもシングルスレッド方式で実行されるため、マルチコア プロセッサ システムではパフォーマンスを最大化できません。この記事では主に、Node.js のクラスタリングを容易にするための PM2 の使い方を詳しく紹介します。編集者が非常に優れていると考えたので、参考として共有します。編集者をフォローして見てみましょう。皆さんのお役に立てれば幸いです。
Node.js のクラスター モジュール
幸いなことに、Node.js は、同じ TCP 接続を共有する複数のワーカー スレッドを生成できるクラスター モジュールを提供します。
どのように機能しますか?
まず、クラスターはマスターを作成し、指定した数に従って複数のサーバー アプリ (ワーカー スレッドとも呼ばれます) を複製します。 IPC チャネルを介してワーカー スレッドと通信し、組み込みの負荷分散を使用してスレッド間の圧力を適切に処理します。負荷分散にはラウンドロビン アルゴリズム (ラウンドロビン アルゴリズムとも呼ばれます) が使用されます。
ラウンドロビン スケジューリング戦略を使用する場合、マスターはすべての受信接続リクエストを accept() し、対応する TCP リクエスト処理を選択されたワーカー スレッドに送信します (このメソッドは引き続き IPC 経由で通信します)。
どうやって使うの?
これが基本的な例です:
var cluster = require('cluster'); var http = require('http'); var os = require('os'); var numCPUs = os.cpus().length; if (cluster.isMaster) { // Master: // Let's fork as many workers as you have CPU cores for (var i = 0; i < numCPUs; ++i) { cluster.fork(); } } else { // Worker: // Let's spawn a HTTP server // (Workers can share any TCP connection. // In this case its a HTTP server) http.createServer(function(req, res) { res.writeHead(200); res.end("hello world"); }).listen(8080); }
もちろん、スレッドの数は CPU 上のサブスレッドとして実行されるだけなので、CPU コアの数に制限されません。
ご覧のとおり、適切に動作させるには、コードをクラスターの処理ロジックにカプセル化し、スレッドがハングした場合の動作を指定する追加のコードを追加する必要があります。
PM2の使用方法
組み込みクラスター
PM2には上記の処理ロジックがすべて内部に含まれているため、コードを変更する必要はありません。上記のコードを元の形式に復元します:
var http = require('http'); http.createServer(function(req, res) { res.writeHead(200); res.end("hello world"); }).listen(8080);
そして、コンソールで実行します:
$ pm2 start app.js -i 4
-i <ワーカー数> このパラメータは、cluster_mode (対応する名前は fork_mode です)、次の数字は開始されるワーカー スレッドの数を示します。指定された数が 0 の場合、PM2 は CPU コアの数に基づいて対応するワーカー スレッドを生成します。
どのような状況であってもアプリを実行し続けます
ワーカー スレッドがハングアップしても、心配しないでください。PM2 はすぐに再起動します。もちろん、いつでもこれらのスレッドを手動で再起動することもできます:
リアルタイムでクラスターを拡張します
ワーカー スレッドの数を増やす必要がある場合はいつでも、pm2 スケールを通じて実行できます < ;アプリ名>n> クラスターを展開します。パラメータ 実稼働環境でダウンタイムゼロの更新を実現 PM2 のリロード <アプリ名> 関数は、すべてのワーカー スレッドを順番に再起動します。各スレッドは終了する前に新しいスレッドが作成されるのを待機するため、実稼働環境に新しいコードをデプロイしても、サーバーは中断されることなく実行を継続します。 gracefulReload 関数を使用すると同じ目的を達成できますが、違いはワーカー スレッドをすぐに終了せず、IPC 経由でシャットダウン シグナルを送信して現在の接続をすべて閉じ、いくつかのカスタム タスクを処理してから正常に終了することです。たとえば、次のコード: PM2 を自動的に起動するように設定します サーバーの再起動後に PM2 で前のアプリケーションを自動的に実行するようにしたい場合は、まず pm2 start を通じてアプリケーションを起動し、次に次のコマンドを実行します。 process.on('message', function(msg) {
if (msg === 'shutdown') {
close_all_connections();
delete_cache();
server.close();
process.exit(0);
}
});
pm2 save
これにより、~/.pm2 ディレクトリに dump.pm2 ファイルが生成されます。このファイルには、現在 PM2 で実行されているすべてのアプリケーションが記述されています。次に、次のコマンドを実行します:
pm2 startup [platform]
現在のシステム環境を pm2 に明確に通知するには、オプションのパラメーター platform を追加する必要があることに注意してください。このようにして、次回サーバーが再起動されると、PM2 は以前に保存されたアプリケーションを自動的に実行します。 結論 Cluster モジュールは非常に強力で、PM2 を使用すると簡単になります。 Node 0.10.x の時代では、cluster.js はまだ実験的な製品でしたが、Node 0.11.x から徐々に成熟し、Node 0.12.x バージョンを含む正式リリースの準備が始まりました。 Node.js と PM2 の最新バージョンを使用することを強くお勧めします。これらの製品の開発者は、製品を改良するために常に努力しています。 関連する推奨事項:
以上がPM2 を使用して Node.js クラスタリングを簡単にする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。