LoginSignup
26
25

More than 5 years have passed since last update.

node.jsを使った停止なしサーバ (Graceful restart in node.js)

Last updated at Posted at 2012-06-13

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);
}
26
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
25