Node.jsはマルチスレッドではなく、シングルスレッドのイベントループで処理しています。
サーバーのCPUのコア数が多ければの話ですが、Node0,8から導入されたclusterモジュールを使うことで別々のプロセスに割り振ることができるので並列処理が可能です。
ユースケース
- Webサーバーのhttpリクエストの振り分け
- socket.ioでwebsocketリクエストの振り分け
仕組み
基本的に、1つのポートにアクセスさせれるのは一つのプロセスまでなので複数プロセスに分けてしまうと普通はダメです。
そこで、clusterモジュールはマスタープロセスを複数の子プロセスにforkしてプロセス間通信(IPC)を実現しています。
clusterモジュールでは、子プロセスのことをワーカーと呼んでいます。
メリット
大量のリクエストが来た場合に、並列処理しない場合に比べて大幅にスループットも平均応答時間も向上します。できるのであればやった方が良いでしょう。
実装例
Webサーバ(Express)をクラスター化するサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
var cluster = require("cluster"); var express = require("express"); var numCPUs = require("os").cpus().length; console.log("cluster.isMaster", cluster.isMaster); if (cluster.isMaster) { for (var i = 0; i < numCPUs; i++) { console.log("numCPUs", i); cluster.fork(); } } else { var app = express(); app.get("/", function (req, res) { res.send("Hello World!"); }); app.listen(8080); } |
まずは、isMasterに入ってcpuの数分だけフォークし、その後子プロセスの数だけlistenします。
あとは、clusterがWebサーバーに来たリクエストを別々に負荷分散して処理してくれます。
仕組み
cluster.isMaster(マスタープロセス)が振り分けの窓口になっています。その後、ラウンドロビンでワーカープロセスに委ねる形になっています。
この記事へのコメントはありません。