クラスタモード
クラスタモードを使用すると、ネットワーク化されたNode.jsアプリケーション(http(s)/tcp/udpサーバー)を、コードを修正することなく、利用可能なすべてのCPUに拡張できます。これにより、利用可能なCPU数に応じて、アプリケーションのパフォーマンスと信頼性が大幅に向上します。内部的には、Node.jsのclusterモジュールを使用しており、拡張されたアプリケーションの子プロセスがサーバーポートを自動的に共有できます。詳細については、Node.jsのclusterモジュールに関する公式ドキュメントの仕組みを参照してください。
使い方
クラスタモードを有効にするには、-iを渡すだけです
pm2 start app.js -i max
max
は、PM2が利用可能なCPU数を自動検出し、可能な限り多くのプロセスを実行することを意味します
または、js/yaml/jsonファイル経由で
module.exports = {
apps : [{
script : "api.js",
instances : "max",
exec_mode : "cluster"
}]
}
注意:exec_modeをcluster
に設定する必要があります。これにより、PM2はインスタンス間でロードバランシングを行いたいことを認識します。デフォルトではロードバランシングは行いません。
次に、プロセスファイルを開始します
pm2 start processes.json
-iまたはinstancesオプションは次のようになります。
- 0/max:すべてのCPUにアプリケーションを分散します
- -1:すべてのCPU-1にアプリケーションを分散します
- 数値:アプリケーションを数値のCPUに分散します
リロード
プロセスをkillして再起動するrestart
とは対照的に、reload
は0秒ダウンタイムのリロードを実現します。
アプリをリロードするには
pm2 reload <app_name>
または
pm2 reload process.json
pm2 reload process.json --only api
リロードシステムがアプリケーションのリロードに失敗した場合、タイムアウトにより従来の再起動にフォールバックします。
グレースフルシャットダウン
本番環境では、アプリケーションを終了する前に、残りのクエリが処理されるのを待つか、すべての接続を閉じる必要がある場合があります。PM2リロードコンテキストでは、非常に長いリロード、または機能しないリロード(再起動へのフォールバック)として解釈される可能性があります。これは、アプリケーションが終了時に開いている接続をまだ持っていることを意味します。あるいは、すべてのデータベース接続を閉じたり、データキューをクリアしたりする必要があるかもしれません。
アプリケーションをグレースフルシャットダウンするには、SIGINTシグナル(PM2が終了時に送信する最初のシグナル)をキャッチし、これらのすべての状態を待機/クリアするアクションを実行できます。
process.on('SIGINT', function() {
db.stop(function(err) {
process.exit(err ? 1 : 0);
});
});
グレースフルシャットダウン機能の詳細をご覧ください。
アプリケーションをステートレス化する
アプリケーションがステートレスであることを確認してください。つまり、セッション/WebSocket接続、セッションメモリなど、ローカルデータがプロセスに保存されていないことを意味します。プロセス間で状態を共有するには、Redis、Mongoなどのデータベースを使用してください。
効率的な本番対応のステートレスアプリケーションを作成する方法に関するもう1つのリソースは、The Twelve Factor Applicationマニフェストです。
このページに貢献する