ホームページ  >  記事  >  ウェブフロントエンド  >  PM2 により Node.js クラスタリングの実装が容易になります

PM2 により Node.js クラスタリングの実装が容易になります

小云云
小云云オリジナル
2018-01-18 16:48:411241ブラウズ

この記事では主に、Node.js のクラスタリングを容易にするための PM2 の使い方を詳しく紹介します。編集者が非常に優れていると考えたので、参考として共有します。編集者をフォローして見てみましょう。皆さんのお役に立てれば幸いです。

はじめに

ご存知のとおり、Node.js は Chrome の JavaScript ランタイム プラットフォーム (上品に V8 エンジンと呼ばれています) 上で実行されます。 V8 エンジンとそれ以降の Node.js はどちらもシングルスレッド方式で実行されるため、マルチコア プロセッサ システムではパフォーマンスを最大化できません。

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&#39;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(&#39;http&#39;);

http.createServer(function(req, res) { 
 res.writeHead(200);
 res.end("hello world");
}).listen(8080);

に復元し、コンソールで実行します:


$ pm2 start app.js -i 4

-i 1da59d222f91d54424126fdbe8a1bb1d でプログラムを実行するように PM2 に指示します。 cluster_mode アプリ (対応して fork_mode と呼ばれます) の場合、次の数字は開始されるワーカー スレッドの数を示します。指定された数が 0 の場合、PM2 は CPU コアの数に基づいて対応するワーカー スレッドを生成します。

どのような状況であってもアプリを実行し続けます

ワーカー スレッドがハングアップしても、心配しないでください。PM2 はすぐに再起動します。もちろん、いつでもこれらのスレッドを手動で再起動することもできます:

リアルタイムでクラスターを拡張します

ワーカー スレッドの数を増やす必要がある場合はいつでも、pm2 スケールを通じて実行できます < ;アプリ名>n> クラスターを展開します。パラメータ はワーカー スレッドの数を指定し、クラスターの数を増減するために使用されます。 pm2 スケール アプリ +3 を通じて追加するワーカー スレッドの数を指定することもできます。

実稼働環境でダウンタイムゼロの更新を実現

PM2 のリロード cc30eafb43faffe7a496cf37e69e8335 関数は、すべてのワーカー スレッドを順番に再起動します。各スレッドは終了する前に新しいスレッドが作成されるのを待機するため、実稼働環境に新しいコードをデプロイしても、サーバーは中断されることなく実行を継続します。

gracefulReload 関数を使用すると同じ目的を達成できますが、違いはワーカー スレッドをすぐに終了せず、IPC 経由でシャットダウン シグナルを送信して現在の接続をすべて閉じ、いくつかのカスタム タスクを処理してから正常に終了することです。たとえば、次のコード:


process.on(&#39;message&#39;, function(msg) { 
 if (msg === &#39;shutdown&#39;) {
  close_all_connections();
  delete_cache();
  server.close();
  process.exit(0);
 }
});

PM2 が自動的に起動するように設定します

サーバーの再起動後に PM2 で前のアプリケーションを自動的に実行するようにしたい場合は、まず pm2 start を通じてアプリケーションを起動し、次に次のコードを実行します。コマンド:


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 の最新バージョンを使用することを強くお勧めします。これらの製品の開発者は、製品を改良するために常に努力しています。

関連するおすすめ:

Redis クラスター障害の分析

Redis クラスター構築のグラフィックチュートリアル

Redis クラスター構築のチュートリアルと発生した問題の処理

以上がPM2 により Node.js クラスタリングの実装が容易になりますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。