【Node.js】express4 で cluster

express4 で cluster を使ってみる。

まずは cluster.js というファイルを作る。
作る場所はとりあえず app.js と同じ階層にでもしておくといい。
これはあとで変更できる。

ファイル内容は以下になる。
clusterの構文そのままで、
elseの部分にnodeのエントリーポイントとなるスクリプトを指定する。

//cluster.js
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
} else {
    //ここにエントリーポイントとなるファイルを指定する。
}

expressのエントリーポイントとなるスクリプトは /bin/www なので指定する。

//cluster.js
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
} else {
	//ここを追記しただけ。
	require("./bin/www");
}

clusterは自動でコア数分のプロセスを立ち上げてくれる。
上記の numCPUs がプロセス数になる。

これで準備はOK。
あとは起動するだけだが、起動方法がexpressのデフォルトとは異なる。
# node cluster.js

expressのデフォルトの起動ファイルである www ではなく、
cluster.js を起動する必要がある。

cluster.js を起動すると、
子プロセスが www を起動し、
www でapp.js が読み込まれるイメージ。

「wwwを起動する」というのは cluster.js の require("./bin/www"); の部分。

cluster.js は子プロセスを生成することでマルチプロセスを実現しているので、
最初に cluster.js を起動する必要がある。

プロセスが多いと起動には時間がかかるので、
起動直後に動作確認してエラーになっても慌ててはいけない。

起動したプロセスはpsコマンドで確認できる。
# ps -ef | grep node

nodeの親プロセス + CPUのコア分の子プロセスが立ち上がっていたら成功。

ちなみに、cluster.js がエントリーポイントであり、
wwwが読み込まれればいいので、
cluster.js の設置場所はどこでもいい。