注: 个人浅见,辩证阅读,如有错误,欢迎指正。
守护进程(daemon)
一个在后台运行并且不受任何终端控制的进程。通常在系统引导装入时启动,在系统关闭时才终止。
Node 后台运行
想要创建一个守护进程,首先我们需要让这个进程具备后台运行的能力,这里使用 nohup
来创建一个后台运行的进程。
nohup node XXXX.js &
守护进程一般的职责
守护进程我个人看来,一般不会执行具体逻辑处理,它主要负责子进程的监控调度
工作。
全局错误捕捉和上报
process.on('uncaughtException', (err) => {
// 上报日志等操作
console.error(err);
// 关闭服务
process.exit(1);
})
内存泄漏监控
setInterval(() => {
if (process.memoryUsage().res > 700 * 1024 * 1024) {
// 上报内存溢出
console.log('oom');
process.exit(1);
}
}, 5000);
子进程自动重启
// 有子进程退出时的钩子
cluster.on('exit', () => {
setTimeout(() => {
cluster.fork();
}, 5000);
})
子进程心跳检查是否处于假死状态
父进程
const worker = cluster.fork();
const pid = worker.process.pid;
const TIME_INTERVAL = 10 * 1000; // 10s 时间间隔
const MAX_MISSED = 3; // 允许的最大丢失数量
let missed = 0; // 丢失 pong 的次数
let timer = setInterval(() => {
if (missed >= MAX_MISSED) {
clearInterval(timer);
console.log(`${pid} has become a zombie process`);
process.kill(pid);
return;
}
missed += 1;
// 发送 ping 通信
worker.send(`ping#${pid}`);
}, TIME_INTERVAL);
// 接收 pong 通信
worker.on('message', (msg) => {
if (msg === `pong#${pid}`) {
missed -= 1;
}
})
子进程
const pid = process.pid;
process.on('message', (msg) => {
if (msg === `ping#${pid}`) {
process.send(`pong#${pid}`);
}
})
框架工具
- pm2
- forever
- nodemon