序文
PM2 を使用して Node.js プロセスを管理したことがある場合は、PM2 が クラスター モード をサポートしていることに気づいたかもしれません。このモードでは、Node.js で複数のプロセスを作成できます。クラスター モードのインスタンス数を max に設定すると、PM2 はサーバーで使用可能な CPU コアに対応する数のノード プロセスを自動的に作成します。
PM2 は、Node.js の Cluster モジュールを利用してこれを実現します。このモジュールは、従来、複数の CPU コアを利用する能力を制限していた Node.js のシングルスレッドの性質に対処します。しかし、Cluster モジュールは内部的にどのように動作するのでしょうか?プロセスはどのように相互に通信するのでしょうか?複数のプロセスが同じポートでリッスンするにはどうすればよいでしょうか?そして、Node.js はどのようにリクエストをこれらのプロセスに分散するのでしょうか?これらの質問に興味がある場合は、読み続けてください。
基本原則
Node.js ワーカー プロセスは、child_process.fork() メソッドを使用して作成されます。これは、1 つの親プロセスと複数の子プロセスが存在することを意味します。コードは通常次のようになります:
const cluster = require('cluster'); const os = require('os'); if (cluster.isMaster) { for (let i = 0, n = os.cpus().length; i <p>オペレーティング システムを勉強したことがある方は、おそらく fork() システム コールに精通しているでしょう。呼び出しプロセスは親であり、新しく作成されたプロセスは子です。これらの子プロセスは、親プロセスと同じデータ セグメントとスタックを共有しますが、物理メモリ空間は必ずしも共有されるわけではありません。 Node.js クラスターでは、<strong>マスター</strong> プロセスがポートでリッスンし、受信リクエストを <strong>ワーカー</strong> プロセスに分散します。これには、<strong>プロセス間通信 (IPC)</strong>、<strong>負荷分散戦略</strong>、および<strong>マルチプロセス ポート リスニング</strong>という 3 つの主要トピックへの対応が含まれます。</p> <h2> プロセス間通信 (IPC) </h2> <p><strong>マスター</strong> プロセスは、process.fork() を使用して子プロセスを作成します。これらのプロセス間の通信は、<strong>IPC チャネル</strong> を介して処理されます。オペレーティング システムは、次のようなプロセス間通信のためのいくつかのメカニズムを提供します。</p> <ol> <li> <strong>共有メモリ</strong> 複数のプロセスが単一のメモリ空間を共有し、多くの場合、同期と相互排他のためにセマフォで管理されます。</li> <li><p><strong>メッセージパッシング</strong><br><br> プロセスはメッセージを送受信することでデータを交換します。</p></li> <li><p><strong>セマフォ</strong><br><br> セマフォは、システムによって割り当てられたステータス値です。制御を欠いたプロセスは、特定のチェックポイントで強制的に停止され、続行信号を待ちます。バイナリ値 (0 または 1) に限定される場合、このメカニズムは「ミューテックス」(相互排他ロック) として知られています。</p></li> <li><p><strong>パイプ</strong><br><br> パイプは 2 つのプロセスを接続し、あるプロセスの出力を別のプロセスの入力として機能させることができます。これは、パイプ システム コールを使用して作成できます。 |シェル スクリプトのコマンドは、このメカニズムの一般的な例です。</p></li> </ol> <p>Node.js は、親プロセスと子プロセス間の通信にイベントベースのメカニズムを使用します。以下は、親プロセスが TCP サーバー ハンドルを子プロセスに送信する例です:<br> </p> <pre class="brush:php;toolbar:false">const cluster = require('cluster'); const os = require('os'); if (cluster.isMaster) { for (let i = 0, n = os.cpus().length; i <h2> 負荷分散戦略 </h2> <p>前述したように、すべてのリクエストは <strong>マスター</strong> プロセスによって分散されます。サーバーの負荷がワーカー プロセス間で均等に分散されるようにするには、負荷分散戦略が必要です。 Node.js はデフォルトで <strong>ラウンドロビン</strong> アルゴリズムを使用します。</p> <h3> ラウンドロビン </h3> <p>ラウンドロビン方式は、Nginx でも採用されている一般的な負荷分散アルゴリズムです。これは、受信リクエストを各プロセスに順番に分散し、最初のプロセスから開始し、最後のプロセスに到達した後にループバックすることで機能します。ただし、この方法では、すべてのプロセスで処理能力が等しいことを前提としています。リクエストの処理時間が大きく異なるシナリオでは、負荷の不均衡が発生する可能性があります。</p> <p>これに対処するために、Nginx はサーバーに異なる重みを割り当てる <strong>加重ラウンドロビン (WRR)</strong> をよく使用します。最も高い重みを持つサーバーがその重みがゼロになるまで選択され、その時点で新しい重みシーケンスに基づいてサイクルが再開されます。</p> <p>Node.js で負荷分散戦略を調整するには、NODE_CLUSTER_SCHED_POLICY 環境変数を設定するか、cluster.setupMaster(options) を介して構成します。マルチマシン クラスタ用の Nginx と、単一マシン マルチプロセスのバランシング用の Node.js クラスタを組み合わせるのが一般的なアプローチです。</p> <h2> マルチプロセスポートリスニング </h2> <p>Node.js の初期のバージョンでは、同じポートでリッスンしている複数のプロセスが受信接続を競合し、不均一な負荷分散を引き起こしていました。この問題は後にラウンドロビン戦略で解決されました。現在のアプローチは次のように機能します:</p> <ol> <li> <strong>マスター</strong> プロセスはソケットを作成し、それをアドレスにバインドして、リッスンを開始します。</li> <li>ソケットのファイル記述子 (fd) はワーカー プロセスに渡されません。</li> <li>マスター プロセスは新しい接続を受け入れると、どのワーカー プロセスがその接続を処理するかを決定し、それに応じて転送します。</li> </ol> <p>本質的に、マスター プロセスはポートをリッスンし、定義された戦略 (ラウンドロビンなど) を使用してワーカー プロセスに接続を分散します。この設計ではワーカー間の競合が排除されますが、マスター プロセスが非常に安定している必要があります。</p><h2> 結論 </h2> <p>この記事では、PM2 のクラスター モードをエントリ ポイントとして使用して、マルチプロセス アプリケーションを実装するための Node.js のクラスター モジュールの背後にある中心的な原則を検討しました。私たちは、プロセス間通信、負荷分散、マルチプロセス ポート リスニングという 3 つの重要な側面に焦点を当てました。</p> <p>クラスター モジュールを学習すると、多くの基本原則とアルゴリズムが普遍的であることがわかります。たとえば、ラウンドロビン アルゴリズムは、オペレーティング システムのプロセス スケジューリングとサーバーの負荷分散の両方で使用されます。マスター ワーカー アーキテクチャは、Nginx のマルチプロセス設計に似ています。同様に、セマフォやパイプなどのメカニズムは、さまざまなプログラミング パラダイムで遍在しています。</p> <p>新しいテクノロジーが継続的に登場しますが、その基礎は一貫しています。これらの核となる概念を理解することで、自信を持って新たな課題を推測し、適応できるようになります。</p> <hr> <h3> 私たちは Leapcell であり、Node.js プロジェクトをクラウドにデプロイするための最良の選択肢です。 </h3> <p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173689747511076.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="Understanding Node.js Cluster: The Core Concepts"></p> <p>Leapcell は、Web ホスティング、非同期タスク、Redis 用の次世代サーバーレス プラットフォームです:</p> <p><strong>多言語サポート</strong></p>
- Node.js、Python、Go、または Rust を使用して開発します。
無制限のプロジェクトを無料でデプロイ
- 使用料金のみお支払いください。リクエストや料金はかかりません。
比類のないコスト効率
- アイドル料金なしの従量課金制です。
- 例: $25 は、平均応答時間 60 ミリ秒で 694 万のリクエストをサポートします。
効率化された開発者エクスペリエンス
- 直感的な UI でセットアップが簡単です。
- 完全に自動化された CI/CD パイプラインと GitOps の統合。
- 実用的な洞察を得るリアルタイムのメトリクスとログ。
簡単な拡張性と高いパフォーマンス
- 自動スケーリングにより、高い同時実行性を簡単に処理できます。
- 運用上のオーバーヘッドがゼロ - 構築だけに集中できます。
ドキュメントでさらに詳しく見てみましょう!
X でフォローしてください: @LeapcellHQ
ブログをお読みください
以上がNode.js クラスターを理解する: 中心となる概念の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

JavaScript文字列置換法とFAQの詳細な説明 この記事では、javaScriptの文字列文字を置き換える2つの方法について説明します:内部JavaScriptコードとWebページの内部HTML。 JavaScriptコード内の文字列を交換します 最も直接的な方法は、置換()メソッドを使用することです。 str = str.replace( "find"、 "置換"); この方法は、最初の一致のみを置き換えます。すべての一致を置き換えるには、正規表現を使用して、グローバルフラグGを追加します。 str = str.replace(/fi

このチュートリアルでは、カスタムGoogle検索APIをブログまたはWebサイトに統合する方法を示し、標準のWordPressテーマ検索関数よりも洗練された検索エクスペリエンスを提供します。 驚くほど簡単です!検索をyに制限することができます

楽なWebページレイアウトのためにjQueryを活用する:8本質的なプラグイン jQueryは、Webページのレイアウトを大幅に簡素化します。 この記事では、プロセスを合理化する8つの強力なjQueryプラグイン、特に手動のウェブサイトの作成に役立ちます

それで、あなたはここで、Ajaxと呼ばれるこのことについてすべてを学ぶ準備ができています。しかし、それは正確には何ですか? Ajaxという用語は、動的でインタラクティブなWebコンテンツを作成するために使用されるテクノロジーのゆるいグループ化を指します。 Ajaxという用語は、もともとJesse Jによって造られました

コアポイント これは通常、メソッドを「所有」するオブジェクトを指しますが、関数がどのように呼び出されるかに依存します。 現在のオブジェクトがない場合、これはグローバルオブジェクトを指します。 Webブラウザでは、ウィンドウで表されます。 関数を呼び出すと、これはグローバルオブジェクトを維持しますが、オブジェクトコンストラクターまたはそのメソッドを呼び出すとき、これはオブジェクトのインスタンスを指します。 call()、apply()、bind()などのメソッドを使用して、このコンテキストを変更できます。これらのメソッドは、与えられたこの値とパラメーターを使用して関数を呼び出します。 JavaScriptは優れたプログラミング言語です。数年前、この文はそうでした

この投稿は、Android、BlackBerry、およびiPhoneアプリ開発用の有用なチートシート、リファレンスガイド、クイックレシピ、コードスニペットをコンパイルします。 開発者がいないべきではありません! タッチジェスチャーリファレンスガイド(PDF) Desigの貴重なリソース

jQueryは素晴らしいJavaScriptフレームワークです。ただし、他のライブラリと同様に、何が起こっているのかを発見するためにフードの下に入る必要がある場合があります。おそらく、バグをトレースしているか、jQueryが特定のUIをどのように達成するかに興味があるからです

記事では、JavaScriptライブラリの作成、公開、および維持について説明し、計画、開発、テスト、ドキュメント、およびプロモーション戦略に焦点を当てています。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

ドリームウィーバー CS6
ビジュアル Web 開発ツール

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

ホットトピック









