web-dev-qa-db-ja.com

PM2のクラスターモードとフォークモードの違い

この質問を理解するためによく検索しましたが、明確な説明がありませんでした。クラスター化されたアプリはスケールアウトでき、フォークされたアプリはスケールアウトできないという違いは1つだけですか?

PM2の公開サイトは、クラスターモードでできることを説明しています これらの機能 しかし、フォークモードの長所については誰も言いません(多分、NODE_APP_INSTANCE変数を取得できます)。

Forkは一般的に使用されているようであるため、ClusterはForkの一部であると思われます。したがって、フォークはPM2の点から単に「フォークされたプロセス」を意味し、クラスターは「スケールアウト可能なフォークされたプロセス」を意味すると思います。次に、なぜフォークモードを使用する必要がありますか?

71
Jinyoung Kim

fork_modecluster_modeの主な違いは、pm2に child_process.fork apiまたは cluster apiを使用するように命令することです。

これは内部的にはどういう意味ですか?

フォークモード

基本プロセス生成としてforkモードを使用します。これにより、exec_interpreterを変更できるため、pm2でphpまたはpythonサーバーを実行できます。はい、exec_interpreterは子プロセスを開始するために使用される「コマンド」です。デフォルトでは、pm2はnodeを使用するため、pm2 start server.jsは次のようになります。

require('child_process').spawn('node', ['server.js'])

このモードは多くの可能性を可能にするため、非常に便利です。たとえば、事前に確立されたポートで複数のサーバーを起動し、HAProxyまたはNginxによって負荷分散することができます。

クラスターモード

clusterは、nodejsクラスターモジュールにアクセスするため、exec_interpreterであるため、nodeでのみ動作します(例:isMasterforkメソッドなど)。プロセスは複数のインスタンスで自動的に分岐されるため、これはゼロ構成プロセス管理に最適です。たとえば、pm2 start -i 4 server.jsserver.jsの4つのインスタンスを起動し、クラスターモジュールに負荷分散を処理させます。

95
soyuka

Node.jsはシングルスレッドです。

つまり、IntelクアッドコアCPUの1つのコアのみがノードアプリケーションを実行できます。

fork_modeと呼ばれました。

local devに使用します。

pm2 start server.js -i 0は、CPUの各コアで1ノードスレッドを実行するのに役立ちます。

そして、auto-load-balanceステートレス着信リクエスト。

同じポートで。

cluster_modeと呼びます。

本番環境でのパフォーマンスのために使用されます。

また、PCのストレステストを行う場合は、ローカルdevでこれを行うこともできます。

31
haotang

ここではドキュメントとソースが本当に誤解を招きます。

ソースでこれを調べると、唯一の違いは、ノードclusterまたはchild_process AP​​Iを使用していることです。 clusterは後者を使用するため、実際には同じことをしています。さらに多くのカスタムstdioが、発生するインfork_modeをパススルーします。また、clusterは、オブジェクトではなく、文字列を介してのみ通信できます。

デフォルトでは、fork_modeを使用しています。 -i [number]-オプションを渡すと、cluster_modeになります。これは通常、pm2を使用して目的としています。

また、fork_modeインスタンスは、おそらくEADDRINUSEが原因で同じポートでリッスンできません。 cluster_modeできます。このようにして、自動的に負荷分散される同じポートで実行するようにアプリを構成することもできます。その後、状態なしでアプリを構築する必要があります。セッション、DB。

14