Node.jsでのマルチプロセスについて
この記事は?
Node.jsで大量のデータを扱う必要がある場合に、マルチプロセスでの動作を検討する必要があった。
その時に調べたことのメモ。
実装例などはまた改めて。
調べたこと
そもそもNode.jsでハードウェアリソースを使い切れるのか
No。
Node.jsはシングルスレッドモデルで動作するので、
1つのNode.jsプロセスは1つのCPUコアを最大限に利用することができる。
しかし、マルチコアCPUシステムにおいて、すべてのCPUコアお使用率を上げるには
複数のNode.jsプロセスを並行に動作させる必要がある。
そこでマルチプロセス。
なお、マルチスレッドでは、Node.jsプロセスが複数のスレッドを用いても、
単一のプロセス上での動作なのでマルチコア化での状況は変わらない。
どうやってマルチプロセスを動作させるか。
child_processモジュールやclusterモジュールを使用してマルチプロセスを実現することができる。
Clusterモジュール
特性
Node.jsアプリケーションがシステム上の複数のコアを利用することを可能にする。
これはClusterモジュールにより、プロセスの複製を作成する(forkする)ことで実現する。
その結果、同じポートで複数のワーカープロセスをリスニングさせることが可能となる。
メリット
設定が容易であり、HTTPやTCPサーバのロードバランシングに適している。
また、ワーカープロセスがクラッシュした場合に自動的に新しいプロセスを生成する機能がある。
デメリット
マスタープロセスとワーカープロセス間のコミュニケーションは比較的単純なため、
複雑なタスクの実行には向いていない。また、各ワーカーが独立して動作するため、
プロセス間での状態共有が難しい。
採用されるシチュエーション(使い所)
Webサーバー(例:Express.js)を複数のプロセスで実行し、
各プロセスがシステムの異なるCPUコアを利用するようにすることで、
1つのサーバーで効率的にリクエストを処理する。
これにより、シングルプロセスのサーバーがボトルネックになることを防ぐことがでる。
Child Processモジュール
特性
Child Processモジュールを使用すると、
新しいプロセスを生成し、そのプロセスで任意のシステムコマンドを実行したり、
他のNode.jsプログラムを実行したりすることができる。
また、標準入力(stdin)、標準出力(stdout)、標準エラー出力(stderr)などを通じて
親プロセスと通信することが可能である。
メリット
プロセス間でデータを直接やり取りすることが可能であるため、
複雑なタスクを実行するのに適している。
また、任意のシステムコマンドを実行できるので、他のプログラムやスクリプトを呼び出すことが容易である。
デメリット
エラーハンドリングやプロセスの管理(例:新しいプロセスの生成、終了、通信など)を手動で行う必要があるため、
設定や管理が複雑である。また、Clusterモジュールのような自動ロードバランシング機能は提供していない。
採用されるシチュエーション(使い所)
一連のタスクを並列化して処理するバッチ処理や、
Node.jsからシステムコマンドを実行するために使用する。
たとえば、大量のデータを分割して同時に処理するバッチジョブや、