2026-10-23 12:07:00
Node.js的Cluster模块通过创建多进程实现多核CPU利用,主进程管理Worker进程,共享端口并分发连接以实现负载均衡,从而提升应用性能和稳定性。 以下是具体实现方法与关键点说明:
1. Cluster模块基本原理以下代码演示如何启动与CPU核心数相同的Worker进程:
const cluster = require('cluster');const http = require('http');const os = require('os');const numCPUs = os.cpus().length; // 获取CPU核心数if (cluster.isMaster) { console.log(`主进程 ${process.pid} 正在运行`); // 衍生与CPU核心数相同的Worker进程 for (let i = 0; i < numCPUs; i++) { const worker = cluster.fork(); // 监听Worker退出事件,异常时重启 worker.on('exit', (code, signal) => { console.log(`Worker进程 ${worker.process.pid} 已退出`); console.log('正在重启新的Worker...'); cluster.fork(); // 重启新Worker }); }} else { // Worker进程:创建HTTP服务器 http.createServer((req, res) => { res.writeHead(200); res.end(`Hello from Worker ${process.pid}`); }).listen(3000); console.log(`Worker ${process.pid} 已启动,监听3000端口`);}Worker与主进程通过IPC传递消息,需通过主进程中转:
功能增强:PM2提供进程监控、日志管理、热重载等功能,弥补Cluster模块的运维短板。
示例命令:pm2 start app.js -i max # 启动与CPU核心数相同的进程pm2 monit # 实时监控进程状态
默认轮询:Cluster模块默认采用轮询分发连接,适合大多数场景。
自定义策略:通过主进程记录Worker负载,优先分配给空闲进程。
避免Worker间共享文件描述符或全局变量,防止竞争条件。
使用外部存储(如Redis)共享状态数据。
通过合理使用Cluster模块,Node.js应用可充分利用多核CPU资源,提升并发处理能力与稳定性。结合PM2等工具,能进一步简化运维流程,适应生产环境需求。