原生clusterがnodeの熱重量を実現します.

13807 ワード

1.概要
nodeサーバは再起動してから変更コードを実行することができます.もし生産環境で再起動したら、ユーザーの数秒の無応答を引き起こします.この問題に対して、私達はclusterモジュールを利用して、expressフレームに基づくゼロ秒の熱重量を実現できます.
2.原理
マスタープロセスは、再起動命令をモニターするhttpサーバーを開き、再起動命令を監督した後、forkの新しい作業プロセスを作成し、新しい作業プロセスを作成した時に、キル元の古い作業プロセスが熱載を実現しました.プロジェクトの更新が必要な時は、cmdコマンドを使えばいいです.
curl http://localhost:3000/reload
pause
スクリプトはsupervisorと一緒に使用できます.プロセスを守ります.
supervisor -w startServer.js startServer.js
3.ソースコード
const cluster = require('cluster');
const child_process = require('child_process');
const http = require('http');

if (cluster.isMaster) {
     
    console.log(`    ${
       process.pid}     `);
    // fork    
    forkWorkProcess();
    createReloadServer();
    cluster.on('exit', work => {
     
        console.log(`     ${
       work.process.pid}    `);
    });
} else {
     
	// express       
    require('./bin/www');
    console.log(`     ${
       process.pid}    `);
}

//   1     
function forkWorkProcess() {
     
    child_process.exec('nvm use 8.12 64', (e, stdout) => {
     
        console.log(stdout);
        setTimeout(() => {
     
            cluster.fork();
        }, 2000);
    });
}

//          http   
function createReloadServer() {
     
    http.createServer((req, res) => {
     
        if (req.url === '/reload') {
     
            if (cluster.isMaster) {
     
                const arr = Object.keys(cluster.workers);
                if (arr.length !== 0) {
     
                    forkWorkProcess();
                    setTimeout(() => {
     
                        const arr = Object.keys(cluster.workers);
                        process.kill(cluster.workers[arr[0]].process.pid);
                    }, 20000);
                }
            }
            res.end('reloading');
        } else {
     
            res.end('unknow command');
        }
    }).listen(3000);
}

//   log
setInterval(() => {
     
    if (cluster.isMaster) {
     
        const workerArr = Object.keys(cluster.workers);
        //          ,fork      
        if (workerArr.length === 0) {
     
            forkWorkProcess();
        }
        console.log(new Date());
        console.log(workerArr);
    }
}, 10000);