Node.js 集群 (cluster) 模块
cluster 模块用于创建多进程应用,突破单线程限制,充分利用多核 CPU。
核心概念
工作原理
| 角色 | 说明 |
|---|---|
| Master 进程 | 主进程,负责管理 Worker |
| Worker 进程 | 工作进程,处理实际请求 |
判断进程类型
JavaScript
const cluster = require('cluster');
if (cluster.isMaster) {
// 主进程逻辑
console.log('主进程启动');
} else {
// 工作进程逻辑
console.log('工作进程启动');
}
创建集群
基本用法
JavaScript
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
// 根据 CPU 核心数创建工作进程
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`工作进程 ${worker.process.pid} 退出`);
cluster.fork(); // 自动重启
});
} else {
http.createServer((req, res) => {
res.writeHead(200);
res.end(`进程 ${process.pid} 响应\n`);
}).listen(8000);
}
进程间通信
JavaScript
// 主进程
if (cluster.isMaster) {
const worker = cluster.fork();
worker.send({ type: 'config', data: 'settings' });
worker.on('message', (msg) => {
console.log('收到 Worker 消息:', msg);
});
}
// 工作进程
process.on('message', (msg) => {
console.log('收到 Master 消息:', msg);
process.send({ reply: 'ok' });
});
常用事件
JavaScript
cluster.on('fork', (worker) => {
console.log(`工作进程 ${worker.id} 已创建`);
});
cluster.on('online', (worker) => {
console.log(`工作进程 ${worker.id} 已上线`);
});
cluster.on('listening', (worker, address) => {
console.log(`工作进程 ${worker.id} 监听 ${address.port}`);
});
cluster.on('disconnect', (worker) => {
console.log(`工作进程 ${worker.id} 断开连接`);
});
cluster.on('exit', (worker, code, signal) => {
console.log(`工作进程 ${worker.id} 退出,代码: ${code}`);
});
Worker 对象方法
JavaScript
const worker = cluster.fork();
worker.send('消息'); // 发送消息
worker.disconnect(); // 断开连接
worker.kill(); // 终止进程
worker.isDead(); // 是否已终止
worker.isConnected(); // 是否连接中
注意事项
- 所有 Worker 共享同一个端口,由 Master 分发请求
- 默认使用轮询(round-robin)负载均衡策略
- Worker 崩溃后应重启,保证服务稳定
- 共享内存需使用 Redis 或 IPC 通信
要点总结
cluster.isMaster/isWorker判断进程角色cluster.fork()创建工作进程- Worker 数量建议等于 CPU 核心数
- 通过
worker.send()和process.on('message')通信 - 监听
exit事件实现自动重启
📝 发现内容有误?点击此处直接编辑