検索
ホームページウェブフロントエンドjsチュートリアルNode.js クラスターを理解する: 中心となる概念

Understanding Node.js Cluster: The Core Concepts

序文

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 の統合。
  • 実用的な洞察を得るリアルタイムのメトリクスとログ。

簡単な拡張性と高いパフォーマンス

  • 自動スケーリングにより、高い同時実行性を簡単に処理できます。
  • 運用上のオーバーヘッドがゼロ - 構築だけに集中できます。

ドキュメントでさらに詳しく見てみましょう!

Understanding Node.js Cluster: The Core Concepts

X でフォローしてください: @LeapcellHQ


ブログをお読みください

以上がNode.js クラスターを理解する: 中心となる概念の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

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

カスタムGoogle検索APIセットアップチュートリアルカスタムGoogle検索APIセットアップチュートリアルMar 04, 2025 am 01:06 AM

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

8見事なjQueryページレイアウトプラグイン8見事なjQueryページレイアウトプラグインMar 06, 2025 am 12:48 AM

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

独自のAjax Webアプリケーションを構築します独自のAjax Webアプリケーションを構築しますMar 09, 2025 am 12:11 AM

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

&#x27; this&#x27; JavaScriptで?&#x27; this&#x27; JavaScriptで?Mar 04, 2025 am 01:15 AM

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

モバイル開発用のモバイルチートシート10個モバイル開発用のモバイルチートシート10個Mar 05, 2025 am 12:43 AM

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

ソースビューアーでjQueryの知識を向上させますソースビューアーでjQueryの知識を向上させますMar 05, 2025 am 12:54 AM

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

独自のJavaScriptライブラリを作成および公開するにはどうすればよいですか?独自のJavaScriptライブラリを作成および公開するにはどうすればよいですか?Mar 18, 2025 pm 03:12 PM

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

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

EditPlus 中国語クラック版

EditPlus 中国語クラック版

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

MantisBT

MantisBT

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

Safe Exam Browser

Safe Exam Browser

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

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

PhpStorm Mac バージョン

PhpStorm Mac バージョン

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