ホームページ  >  記事  >  ウェブフロントエンド  >  パフォーマンスを向上させるために Node.js アプリケーションをクラスター化する

パフォーマンスを向上させるために Node.js アプリケーションをクラスター化する

DDD
DDDオリジナル
2024-09-19 14:30:09253ブラウズ

Node.js は、速度効率 で知られており、高性能でスケーラブルなアプリケーションを構築するための人気の選択肢となっています。
ただし、Node.js はそのままではシングルスレッドです。つまり、単一の CPU コアで実行され、マルチコア サーバー環境では制限される可能性があります。アプリケーションがリソースを大量に消費する場合、または高トラフィックが予想される場合は、サーバーの CPU コアの使用を最大限に活用する必要があります。
そこで Node.js クラスタリングが登場します。

この投稿では、Node.js クラスタリングとは何か、それが重要な理由、そしてそれを使用してアプリケーションのパフォーマンスを向上させる方法について詳しく説明します。

Node.js クラスタリングとは何ですか?

Node.js クラスタリングは、Node.js アプリケーションの複数のインスタンス (ワーカー) を生成することで、すべての CPU コアを利用できるようにする手法です。
これらのワーカーは同じポートを共有し、マスター プロセスによって管理されます。各ワーカーは受信リクエストを独立して処理できるため、アプリケーションはワークロードを分散し、リクエストを並行して処理できます。

Node.js アプリケーションをクラスタ化すると、次のことが可能になります。

  • 複数の CPU コアを利用する
  • アプリケーションのパフォーマンスを向上させます
  • 1 人のワーカーがクラッシュした場合に備えてフォールト トレランスを提供します
  • コードベースを過度に複雑にすることなく水平方向にスケーリングします

クラスタリングはどのように機能しますか?

Node.js クラスターには、複数の ワーカー プロセスを制御する マスター プロセスがあります。
マスター プロセスは HTTP リクエストを直接処理しませんが、HTTP リクエストを直接処理するワーカーを管理します。クライアントからのリクエストはこれらのワーカー全体に分散され、負荷が効率的に分散されます。

何らかの理由でワーカー プロセスがクラッシュした場合、マスター プロセスは新しいプロセスを生成して、ダウンタイムを最小限に抑えることができます。

どのような場合にクラスタリングを使用する必要がありますか?

クラスタリングは、アプリケーションが次のような場合に特に役立ちます。

  • トラフィックが多く、多数の同時リクエストを処理する必要がある
  • ビデオ エンコード、画像処理、大規模なデータ解析など、CPU に依存するタスクを実行します。
  • 十分に活用されていないマルチコアプロセッサ上で実行される アプリケーションがデータベース クエリや API 呼び出しなどの I/O 操作の待機に多くの時間を費やしている場合、クラスタリングによってパフォーマンスが大幅に改善されない可能性があります。

上記の場合、非同期プログラミング手法を使用して スループット を向上させることができます。

Node.js でクラスタリングを実装する方法

Node.js は、クラスターを簡単に作成するための組み込みクラスター モジュールを提供します。 Node.js アプリケーションをクラスター化する方法の簡単な例を見てみましょう。

ステップ 1: アプリケーションのセットアップ
クラスタリングを追加する前に、単純な HTTP サーバー (server.js) があると仮定します。

const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200);
  res.end('Hello World\n');
});

server.listen(3000, () => {
  console.log(`Worker process ID: ${process.pid} is listening on port 3000`);
});

このアプリケーションは単一コアで実行されます。クラスタリングを使用するように変更してみましょう。

ステップ 2: クラスターモジュールの使用
クラスター モジュールを使用すると、現在のプロセスを複数のワーカー プロセスにフォークできます。クラスタリングを実装する方法は次のとおりです:

const cluster = require('cluster');
const http = require('http');
const os = require('os');

// Get the number of CPU cores
const numCPUs = os.cpus().length;

if (cluster.isMaster) {
  console.log(`Master process ID: ${process.pid}`);

  // Fork workers for each CPU core
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  // Listen for worker exit and replace it with a new one
  cluster.on('exit', (worker, code, signal) => {
    console.log(`Worker ${worker.process.pid} died. Spawning a new one...`);
    cluster.fork();
  });
} else {
  // Workers share the same TCP connection
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('Hello from worker ' + process.pid + '\n');
  }).listen(3000);

  console.log(`Worker process ID: ${process.pid}`);
}

説明:
1.マスター プロセス: プロセスが開始されると、それがマスター プロセス (cluster.isMaster) であるかどうかが確認されます。マスターは、CPU コアごとに 1 つずつ、ワーカー プロセスをフォークする を担当します。 os.cpus() メソッドは、使用可能な CPU コアの数を取得するために使用されます。

2.ワーカー プロセス: CPU コアごとに、新しいワーカーがフォークされます (cluster.fork())。これらのワーカー プロセスは HTTP サーバーを実行し、受信リクエストを処理します。

3.フォールト トレランス: ワーカー プロセスが クラッシュすると、cluster.on('exit') イベントがトリガーされ、死んだワーカーを置き換えるために新しいワーカーが生成されます。

ステップ 3: クラスター化されたアプリケーションをテストする
ここで、アプリケーションを実行すると:

node server.js

Cluster Your Node.js Application for Better Performance

複数のワーカーが作成され、それぞれに一意のプロセス ID が付いていることがわかります。 各リクエストは異なるワーカーによって処理され、負荷を効果的に分散します。

複数のリクエストを送信し、ワークロードがワーカー間でどのように分散されるかを観察することで、クラスタリングによってアプリケーションのパフォーマンスがどのように向上するかをテストできます。

したがって、次回高パフォーマンスの Node.js アプリケーションを構築するときは、クラスタリングを忘れずに考慮してください。

このブログは以上です。さらなるアップデートに注目して、素晴らしいアプリを構築し続けてください! ?✨
コーディングを楽しんでください! ?

以上がパフォーマンスを向上させるために Node.js アプリケーションをクラスター化するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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