ホームページ  >  記事  >  ウェブフロントエンド  >  Node.js のパフォーマンスをマスターする: ワーカー スレッドとクラスタリングの力を解き放つ — Hoai Nho

Node.js のパフォーマンスをマスターする: ワーカー スレッドとクラスタリングの力を解き放つ — Hoai Nho

Barbara Streisand
Barbara Streisandオリジナル
2024-10-21 16:40:02792ブラウズ

Node.js は シングルスレッドであることで知られており、イベント ループを活用して非同期操作を効率的に処理します。ただし、CPU 集中型のタスクを処理したり、複数の CPU コアを利用したりするには、ワーカー スレッドクラスタリング というより高度なアプローチが必要です。この記事では、これらのテクニックについて詳しく説明し、直接使用できる明確な説明実践的なコード例を提供します。

Mastering Node.js Performance: Unlock the Power of Worker Threads and Clustering — Hoai Nho

1.概要: ワーカー スレッドとクラスタリングを使用する理由

  • ワーカー スレッド: イベント ループをブロックすることなく、CPU 集中型のコードを並列実行します。
  • クラスタリング:複数のインスタンス (プロセス)を生成して複数の CPU コアを利用することで、アプリケーションをスケーリングします。

Mastering Node.js Performance: Unlock the Power of Worker Threads and Clustering — Hoai Nho

どちらの手法もスケーラビリティとパフォーマンスに対応しますが、次の点が異なります。

  • ワーカー スレッド: 単一プロセス内での大量の計算に最適です。
  • クラスター: 複数のプロセスを生成して負荷を分散することにより、高トラフィックを処理するのに最適です。

2.イベントループとマルチスレッドの必要性

Node.js の イベント ループ はシングルスレッドです。 I/O バウンドのタスクにはうまく機能しますが、画像処理、暗号化、複雑な計算などのCPU 負荷の高い操作には苦労します。マルチスレッドを使用しない場合、これらの操作はイベント ループをブロックし、パフォーマンスに影響を与えます。

Mastering Node.js Performance: Unlock the Power of Worker Threads and Clustering — Hoai Nho

3. Node.js のワーカー スレッド

Mastering Node.js Performance: Unlock the Power of Worker Threads and Clustering — Hoai Nho

ワーカー スレッドを使用すると、複数のスレッドで JavaScript コードを実行でき、メイン スレッドがブロックされるのを防ぎます。

例: ワーカー スレッドを使用した画像圧縮

この例では、ワーカー スレッドを使用して、メイン イベント ループをブロックせずに画像を圧縮する方法を示します。

ステップ 1: 画像処理のために Sharp をインストールします。

npm install sharp

ステップ 2: image-worker.js (ワーカー コード) を作成します。

npm install sharp

ステップ 3:worker_threads のワーカーを使用するメインスレッド。

const { parentPort, workerData } = require('worker_threads');
const sharp = require('sharp');

// Compress the image
sharp(workerData.inputPath)
  .resize(800, 600)
  .toFile(workerData.outputPath)
  .then(() => parentPort.postMessage('Compression complete'))
  .catch(err => parentPort.postMessage(`Error: ${err.message}`));

仕組み

  • メインスレッドは、画像圧縮タスクをワーカースレッドにオフロードします。
  • イベント ループは、他のタスクを処理するために自由なままです
  • ワーカーは完了すると、メインスレッドにメッセージを送り返します。

4. Node.js でのクラスタリング

クラスタリングには、使用可能なすべての CPU コアを利用して、Node.js プロセスの複数のインスタンスを生成することが含まれます。これは、トラフィックの多い Web サーバーで特に役立ちます。

Mastering Node.js Performance: Unlock the Power of Worker Threads and Clustering — Hoai Nho

例: クラスターを使用した単純な HTTP サーバー

この例では、クラスター モジュールを使用してスケーラブルな HTTP サーバーを作成する方法を示します。

const { Worker } = require('worker_threads');
const path = require('path');

function compressImage(inputPath, outputPath) {
  return new Promise((resolve, reject) => {
    const worker = new Worker(path.resolve(__dirname, 'image-worker.js'), {
      workerData: { inputPath, outputPath }
    });

    worker.on('message', message => resolve(message));
    worker.on('error', reject);
    worker.on('exit', code => {
      if (code !== 0) reject(new Error(`Worker stopped with exit code ${code}`));
    });
  });
}

// Example usage
compressImage('input.jpg', 'output.jpg')
  .then(console.log)
  .catch(console.error);

仕組み

  • プライマリプロセスは、CPUコアの数に基づいて子プロセス(ワーカー)をフォークします。
  • ワーカーは同じポート (この場合は 3000) を共有し、受信リクエストを処理します。
  • ワーカーがクラッシュした場合、クラスター モジュール がワーカーを自動的に再起動し、信頼性を確保します。

5.ワーカースレッドまたはクラスター間の通信

ワーカーコミュニケーション (Pub/Sub パターン)

ワーカーとメインスレッドは、Pub/Sub モデル と同様の、メッセージ パッシング を介して通信します。上記の画像圧縮の例では、ワーカー スレッドは、parentPort.postMessage() を使用してメイン スレッドにステータス更新を送信します。

Mastering Node.js Performance: Unlock the Power of Worker Threads and Clustering — Hoai Nho

クラスターまたはスレッド間のより高度な通信には、Redis Pub/Sub または メッセージ キュー (RabbitMQ など) を使用できます。

6.ワーカー スレッドとクラスタリングをどちらに使用するか?

Aspect Worker Threads Clustering
Use case CPU-intensive tasks High-traffic applications
Execution Runs within a single process Spawns multiple processes
Performance Avoids blocking the event loop Utilizes multiple CPU cores
Communication Message passing between threads Message passing between processes
Fault Tolerance Limited to process-level recovery Can restart individual processes

Mastering Node.js Performance: Unlock the Power of Worker Threads and Clustering — Hoai Nho

使用例

  • ワーカー スレッド: 画像圧縮、データ暗号化、機械学習モデル推論。
  • クラスタリング: 負荷分散された HTTP サーバー、API は 1 秒あたり数千のリクエストを処理します。

7.ワーカーとクラスターを使用するためのベスト プラクティス

Mastering Node.js Performance: Unlock the Power of Worker Threads and Clustering — Hoai Nho

  • 正常なシャットダウン: データ損失を防ぐために、ワーカーまたはクラスターが正常に終了するようにします。
  • ヘルスチェック: ワーカープロセスを監視し、クラッシュした場合は自動的に再起動します。
  • リソース管理: ワーカーがシステムに負荷をかけるのを防ぐために、メモリと CPU の使用量を制限します。
  • 通信戦略: クラスター間の高度なメッセージ受け渡しには、Redis または NATS を使用します。

8.結論

ワーカー スレッドクラスタリング は両方とも、Node.js アプリケーションのパフォーマンスとスケーラビリティを向上させる強力なツールです。ワーカー スレッドは、イベント ループをブロックすることなくCPU に依存するタスクに最適ですが、クラスタリングを使用すると、複数の CPU コアにわたって Web サーバーを水平方向に拡張できます。

違いを理解し、ユースケースに適したアプローチを選択することで、アプリケーションのスループット復元力を大幅に強化できます。

以上がNode.js のパフォーマンスをマスターする: ワーカー スレッドとクラスタリングの力を解き放つ — Hoai Nhoの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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