当node项目只部署一个单进程单实例时,遇到异常发生后程序会崩溃,此时杀掉进程在重启单这段时间会导致服务不能正常使用,这显然会影响用户体验。
所以需要以多进程的模式去部署应用,这样当某一个进程发生异常重启时,此时有其他请求被接受后,其他进程依旧可以对外提供服务,当然前提是你的应用不能够异常多的数不过来。
一、在Node.js应用中使用cluster模块
1、Cluster 核心机制
原理:主进程(Master)创建多个子进程(Worker),共享同一个 TCP 端口,Master 通过 Round-robin 算法分配请求。
优势:
- 多核 CPU 利用率提升 200%~300%
- 高并发场景下请求处理能力翻倍
- 单个 Worker 崩溃时自动重启保障服务可用性
通过合理使用 Cluster 模块,可使 Node.js 应用的并发处理能力提升 3 倍以上。建议通过压力测试工具(如
autocannon
)验证实际性能提升效果。
2、基础使用
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
// 主进程逻辑
if (cluster.isMaster) {
console.log(`主进程 PID: ${process.pid}`);
// 根据 CPU 核心数创建 Worker
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
// Worker 异常退出时自动重启
cluster.on('exit', (worker, code, signal) => {
console.log(`Worker ${worker.process.pid} 退出`);
cluster.fork(); // 重新创建 Worker
});
// Worker 进程逻辑
} else {
http.createServer((req, res) => {
res.writeHead(200);
res.end('请求由 Worker ' + process.pid + ' 处理');
}).listen(3000);
console.log(`Worker 进程 PID: ${process.pid} 已启动`);
}
关键 API
cluster.isMaster |
判断当前进程是否为主进程 |
cluster.fork() |
创建新的 Worker 进程(最多建议创建 CPU 核心数 × 1.5 个)[^4] |
cluster.on('exit') |
监听 Worker 退出事件 |
worker.process.pid |
获取 Worker 的进程 ID |