Node.js製Webアプリの問題点
Node.jsは、その性質上シングルスレッドで処理を実行するので、CPUを1つしか使えません。
しかし、最近のマシンはマルチコアであることが多く、Node.jsを使ったアプリが、その性能を活かしきるができないのは、大変もったいないです。
そこで、ベストなアプローチとして、アプリのクラスタ化を行うことでマルチコアの性能を引き出すことができるようになります。
クラスタ化 is 何
アプリの親となるプロセスをforkして、子となるプロセスを作る。
結果、負荷を分散することができる。
おそらく、「1つCPUでやるより、4つのCPUで処理したほうが早いよね!そうしよう!」がクラスタ化だと思えば良いっぽい。(クアッドコアのマシンの場合ね)
express-clusterを使う
cluster化を行うモジュールはいくつか選択肢があったが、express-clusterを使うことにした。
Flipboard社が作っているモジュールであるということで、そこそこに安定して使えるだろうと判断した。
使い方も至ってシンプルで、以下のように書くだけでアプリのクラスタ化ができる。
'use strict';
const http = require('http');
const express = require('express');
const cluster = require('express-cluster');
let app = express();
let server = http.createServer(app);
let host = process.env.HOST || '127.0.0.1';
let port = process.env.PORT || 3000;
cluster(function(worker) {
server.listen(port, host, () => {
console.log('Server running on http://' + host + ':' + port + ' with pid ' + process.pid + ' with wid ' + worker.id);
});
});
他の選択肢
Cluster
この他にも、Node.js v0.6で追加されたClusterモジュールを使うことによって、アプリをクラスタ化することができる。しかし、結構自分で色々書く必要がありそうで、ダルそう。
throng
「throng」は書くつもり無かったんだけど、ふと久々にリポジトリを見に行くと、つい数日前にv2がリリースされていたので面白半分で書いてみる。
READMEをサクッと見た感じだと、とてもシンプルに書けることが特徴のようだ。
まとめ
まぁ、アプローチの仕方はなんであれ、Node.jsで作ったアプリはクラスタ化しましょうという話でした。