跳到主要内容

认识

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} 已启动`);
}