node.jsの最近のバージョンで標準に追加されたclusterモジュールを使用しての停止なしサーバ.メモリの解放を忘れたり,ファイルを開きっぱなしであったりなどのバグから身を守るために,自動的な世代交代をダウンタイム無しで行います.
Using the cluster module, which is included in recent Node.js, I implemented a graceful restarting server. It prevents a server from leaking memories or file descriptors by restarting periodically. The restart can be done without disconnecting clients immediately (the interval to wait for clients can be set in server.shutdown_timeout).
var http = require('http');
var server = http.Server(function(req, res) {
res.writeHead(200);
res.end("Hello, world!\n");
});
// ポート番号 (Port number to listen)
server.port = 8000;
// 世代交代を行う周期(ミリ秒) (The period of generational change)
server.interval = 10000; // milli-seconds
// サーバの並列度 (Concurrency of servers (it must be more than 1))
server.concurrency = 2;
// 強制終了までの猶予時間 (How long it waits for closing its sockets)
server.shutdown_timeout = 10000; // milli-seconds
var cluster = require('cluster');
if (cluster.isMaster) {
var fork = function() {
var worker = cluster.fork();
worker.timer = setTimeout(function() {
process.kill(worker.pid);
}, server.interval + server.shutdown_timeout);
}
cluster.on('death', function(worker) { clearTimeout(worker.timer); });
fork();
setInterval(fork, server.interval / server.concurrency);
} else {
server.listen(server.port);
server.on('close', function() { process.exit(); });
setTimeout(function() { server.close(); }, server.interval);
}