NodeJSにおけるMaster-Workerパターン:知るべきすべて
Wenhao Wang
Dev Intern · Leapcell

NodeJSは、JavaScriptをベースとした開発プラットフォームで、開発者はJavaScriptを使用してサーバーサイドアプリケーションを記述できます。NodeJSの主要な機能の1つは、シングルスレッド、イベント駆動型のモデルであり、複数のスレッドやプロセスを必要とせずに、多数の同時リクエストを効率的に処理できます。
Master-Workerパターンを使用する理由
ただし、NodeJSのシングルスレッドの性質には、次のような制限があります。
- CPU負荷の高いタスク: 画像処理や暗号化/復号化などのタスクの場合、シングルスレッドが他のリクエストをブロックし、パフォーマンスの低下につながる可能性があります。
- エラー処理: エラーまたは例外が発生した場合、シングルスレッドがクラッシュし、アプリケーション全体の実行が停止する可能性があります。
- マルチコアの利用: シングルスレッドモデルでは、マルチコアCPUを最大限に活用できません。
これらの問題に対処するために、NodeJSはMaster-Workerパターン(クラスターモードとも呼ばれます)を提供します。この分散システム設計パターンは、マスタープロセスと複数のワーカープロセスで構成されています。マスタープロセスはワーカーを管理および監視し、ワーカーは特定のビジネスロジックを処理します。
Master-Workerパターンの実装方法
NodeJSでは、cluster
モジュールを使用してMaster-Workerパターンを実装できます。このモジュールを使用すると、開発者は複数の子プロセスを簡単に作成でき、制御および通信のためのメソッドとイベントが提供されます。cluster
モジュールの基本的な使用手順は次のとおりです。
cluster
モジュールをインポートし、現在のプロセスがマスターかワーカーかを判断します。- マスターの場合は、
cluster.fork()
メソッドを使用して複数のワーカープロセスを作成し、イベントをバインドして、それらの状態とメッセージを監視します。 - ワーカーの場合は、特定のビジネスロジックを実行し、
process.send()
を使用してマスタープロセスにメッセージを送信します。
基本的な使用法
cluster
モジュールの基本的な使用例を次に示します。
const cluster = require('cluster'); const http = require('http'); const numCPUs = require('os').cpus().length; if (cluster.isMaster) { console.log(`Master ${process.pid} is running`); // Fork workers. for (let i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', (worker, code, signal) => { console.log(`Worker ${worker.process.pid} died`); }); } else { // Workers can share any TCP connection. // In this case, it is an HTTP server. http .createServer((req, res) => { res.writeHead(200); res.end('Hello from Worker!'); }) .listen(8000); console.log(`Worker ${process.pid} started`); }
このコードでは、マスタープロセスは最初に自分がマスターであるかどうか(cluster.isMaster
)を確認します。trueの場合、システムのCPUコア数と同じ数のワーカーを作成します。各ワーカーはマスタープロセスの独立したインスタンスであり、独自のメモリとV8インスタンスを持っています。ワーカーはhttp.createServer
を使用してHTTPサーバーを作成し、リクエストのリスニングを開始します。
ワーカーがクラッシュまたは強制終了されると、exit
イベントが発生し、マスターはワーカーを再起動できます。
高度な使用法:Nginxロードバランシングとの統合
Nginxをリバースプロキシおよびロードバランサーとして使用します。Nginxは、受信リクエストを複数のNode.jsプロセスに分散できます。
Nginx構成の例:
http { upstream node_cluster { server 127.0.0.1:8000; server 127.0.0.1:8001; server 127.0.0.1:8002; # ... other Node.js processes } server { listen 80; location / { proxy_pass http://node_cluster; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } } }
この構成では、Nginxは受信リクエストをnode_cluster
で定義されたNode.jsプロセス間で均等に分散します。
Master-Workerパターンを使用する利点
- ロードバランシング: 単一のサーバーで複数のNode.jsプロセスを実行すると、受信リクエストが均等に分散され、スループットが向上します。
- フォールトトレランスと高可用性: ワーカーがクラッシュした場合でも、マスターは他のワーカーに影響を与えることなく再起動できます。
- CPU負荷の高いタスク: 複数のワーカーがCPU負荷の高いタスクを処理できるため、メインスレッドがブロックされるのを防ぎます。
考慮事項
- 状態の共有: 各ワーカープロセスは独立しており、メモリを共有しません。アプリケーションで状態の共有(セッション状態など)が必要な場合は、外部サービスまたはデータベースを使用する必要があります。
結論として、Node.jsのMaster-Workerパターンは、cluster
モジュールを介して実装され、マルチプロセスアプリケーションを作成するためのシンプルでありながら強力な方法を提供し、パフォーマンスと信頼性を向上させます。
Node.jsプロジェクトのホスティングに最適なLeapcellはこちら
Leapcellは、Webホスティング、非同期タスク、Redis向けの次世代サーバーレスプラットフォームです。
多言語サポート
- Node.js、Python、Go、またはRustで開発します。
無制限のプロジェクトを無料でデプロイ
- 使用量に応じてのみ料金が発生します — リクエストや料金は一切ありません。
比類のない費用対効果
- アイドル料金なしの従量課金制。
- 例:25ドルで、平均応答時間60msで694万リクエストをサポートします。
合理化された開発者エクスペリエンス
- 簡単なセットアップのための直感的なUI。
- 完全に自動化されたCI/CDパイプラインとGitOps統合。
- 実用的な洞察のためのリアルタイムのメトリックとロギング。
簡単なスケーラビリティとハイパフォーマンス
- 高い同時実行性を容易に処理するための自動スケーリング。
- 運用上のオーバーヘッドはゼロ — 構築に集中するだけです。
詳細については、ドキュメントをご覧ください。
Xでフォローしてください:@LeapcellHQ