认识
2024年04月09日
一、认识
Cluster
模块的核心作用是解决 Node.js
在单线程模型下无法充分利用多核 CPU
的问题, 通过在多核 CPU
上部署多个 worker
, 解决 Node.js
单线程在 CPU
密集型任务下的性能瓶颈。通过在主进程中使用 cluster.fork()
根据 CPU
核数创建相应数量的 worker
。我们可以让每个 worker
运行相同的服务器逻辑, 并共享同一监听端口。主进程层面对传入请求进行分发, 能够实现简单的负载均衡, 并且监控 worker
的状态, 一旦某个 worker
退出就自动重启,确保服务的高可用性。在实际项目中,我利用 Cluster
模块构建了一个高并发的 HTTP
服务,通过自动重启机制和进程间消息传递,实现了稳定、高效的负载均衡,同时也能及时将故障信息反馈给运维团队。这种模式既提高了性能,也增强了系统的容错能力。
二、语法
const cluster = require('cluster');
const os = require('os');
if (cluster.isMaster) {
// 主进程:根据 CPU 核数启动 worker
const numCPUs = os.cpus().length;
console.log(`主进程 ${process.pid} 正在启动 ${numCPUs} 个工作进程`);
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
// 监听 worker 退出事件,并自动重启
cluster.on('exit', (worker, code, signal) => {
console.log(`工作进程 ${worker.process.pid} 已退出, code: ${code}, signal: ${signal}`);
console.log('正在重启一个新的工作进程...');
cluster.fork();
});
} else {
// Worker 进程:运行实际的业务逻辑,例如启动 HTTP 服务
const http = require('http');
http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello World\n');
}).listen(8000);
console.log(`工作进程 ${process.pid} 已启动`);
}