Node.js は、速度 と 効率 で知られており、高性能でスケーラブルなアプリケーションを構築するための人気の選択肢となっています。
ただし、Node.js はそのままではシングルスレッドです。つまり、単一の CPU コアで実行され、マルチコア サーバー環境では制限される可能性があります。アプリケーションがリソースを大量に消費する場合、または高トラフィックが予想される場合は、サーバーの CPU コアの使用を最大限に活用する必要があります。
そこで Node.js クラスタリングが登場します。
この投稿では、Node.js クラスタリングとは何か、それが重要な理由、そしてそれを使用してアプリケーションのパフォーマンスを向上させる方法について詳しく説明します。
Node.js クラスタリングは、Node.js アプリケーションの複数のインスタンス (ワーカー) を生成することで、すべての CPU コアを利用できるようにする手法です。
これらのワーカーは同じポートを共有し、マスター プロセスによって管理されます。各ワーカーは受信リクエストを独立して処理できるため、アプリケーションはワークロードを分散し、リクエストを並行して処理できます。
Node.js アプリケーションをクラスタ化すると、次のことが可能になります。
Node.js クラスターには、複数の ワーカー プロセスを制御する マスター プロセスがあります。
マスター プロセスは HTTP リクエストを直接処理しませんが、HTTP リクエストを直接処理するワーカーを管理します。クライアントからのリクエストはこれらのワーカー全体に分散され、負荷が効率的に分散されます。
何らかの理由でワーカー プロセスがクラッシュした場合、マスター プロセスは新しいプロセスを生成して、ダウンタイムを最小限に抑えることができます。
クラスタリングは、アプリケーションが次のような場合に特に役立ちます。
上記の場合、非同期プログラミング手法を使用して スループット を向上させることができます。
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
複数のワーカーが作成され、それぞれに一意のプロセス ID が付いていることがわかります。 各リクエストは異なるワーカーによって処理され、負荷を効果的に分散します。
複数のリクエストを送信し、ワークロードがワーカー間でどのように分散されるかを観察することで、クラスタリングによってアプリケーションのパフォーマンスがどのように向上するかをテストできます。
したがって、次回高パフォーマンスの Node.js アプリケーションを構築するときは、クラスタリングを忘れずに考慮してください。
このブログは以上です。さらなるアップデートに注目して、素晴らしいアプリを構築し続けてください! ?✨
コーディングを楽しんでください! ?
以上がパフォーマンスを向上させるために Node.js アプリケーションをクラスター化するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。