この質問を理解するためによく検索しましたが、明確な説明がありませんでした。クラスター化されたアプリはスケールアウトでき、フォークされたアプリはスケールアウトできないという違いは1つだけですか?
PM2の公開サイトは、クラスターモードでできることを説明しています これらの機能 しかし、フォークモードの長所については誰も言いません(多分、NODE_APP_INSTANCE
変数を取得できます)。
Forkは一般的に使用されているようであるため、ClusterはForkの一部であると思われます。したがって、フォークはPM2の点から単に「フォークされたプロセス」を意味し、クラスターは「スケールアウト可能なフォークされたプロセス」を意味すると思います。次に、なぜフォークモードを使用する必要がありますか?
fork_mode
とcluster_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
でのみ動作します(例:isMaster
、fork
メソッドなど)。プロセスは複数のインスタンスで自動的に分岐されるため、これはゼロ構成プロセス管理に最適です。たとえば、pm2 start -i 4 server.js
はserver.js
の4つのインスタンスを起動し、クラスターモジュールに負荷分散を処理させます。
Node.jsはシングルスレッドです。
つまり、IntelクアッドコアCPUの1つのコアのみがノードアプリケーションを実行できます。
fork_mode
と呼ばれました。
local devに使用します。
pm2 start server.js -i 0
は、CPUの各コアで1ノードスレッドを実行するのに役立ちます。
そして、auto-load-balanceステートレス着信リクエスト。
同じポートで。
cluster_mode
と呼びます。
本番環境でのパフォーマンスのために使用されます。
また、PCのストレステストを行う場合は、ローカルdevでこれを行うこともできます。
ここではドキュメントとソースが本当に誤解を招きます。
ソースでこれを調べると、唯一の違いは、ノードcluster
またはchild_process
APIを使用していることです。 cluster
は後者を使用するため、実際には同じことをしています。さらに多くのカスタムstdio
が、発生するインfork_mode
をパススルーします。また、cluster
は、オブジェクトではなく、文字列を介してのみ通信できます。
デフォルトでは、fork_mode
を使用しています。 -i [number]
-オプションを渡すと、cluster_mode
になります。これは通常、pm2
を使用して目的としています。
また、fork_mode
インスタンスは、おそらくEADDRINUSE
が原因で同じポートでリッスンできません。 cluster_mode
できます。このようにして、自動的に負荷分散される同じポートで実行するようにアプリを構成することもできます。その後、状態なしでアプリを構築する必要があります。セッション、DB。