原生clusterがnodeの熱重量を実現します.
1.概要
nodeサーバは再起動してから変更コードを実行することができます.もし生産環境で再起動したら、ユーザーの数秒の無応答を引き起こします.この問題に対して、私達はclusterモジュールを利用して、expressフレームに基づくゼロ秒の熱重量を実現できます.
2.原理
マスタープロセスは、再起動命令をモニターするhttpサーバーを開き、再起動命令を監督した後、forkの新しい作業プロセスを作成し、新しい作業プロセスを作成した時に、キル元の古い作業プロセスが熱載を実現しました.プロジェクトの更新が必要な時は、cmdコマンドを使えばいいです.
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);