Node.js Cluster 模块详解
cluster
模块是 Node.js 中用于创建多进程应用程序的核心模块,它允许 Node.js 应用程序充分利用多核 CPU 系统的计算能力。由于 Node.js 是单线程的,使用 cluster
模块可以显著提高应用程序的性能和可靠性。
一、基本概念与工作原理
1. 为什么需要 Cluster 模块
Node.js 采用单线程事件循环模型,虽然异步 I/O 操作能高效处理高并发,但在 CPU 密集型任务中表现不佳。cluster
模块通过以下方式解决这个问题:
-
多进程架构:创建多个 Node.js 进程(worker),每个进程运行在自己的 V8 实例中
-
负载均衡:主进程(master)通过轮询算法将请求分配给各个工作进程
-
共享端口:所有工作进程可以共享同一个服务器端口(如 HTTP 80 端口)
-
故障隔离:一个工作进程崩溃不会影响其他进程
2. 核心架构
Master Process (主进程)
|
├── Worker Process 1 (工作进程)
├── Worker Process 2
├── Worker Process 3
└── ... (可创建多个工作进程)
-
主进程:负责管理工作进程,不处理实际请求
-
工作进程:处理实际请求的独立进程,由主进程 fork 出来
3. 底层实现
cluster
模块底层使用 child_process.fork()
方法创建工作进程,不同之处在于:
-
工作进程可以共享服务器端口
-
提供了更简洁的进程间通信机制
-
内置了负载均衡功能(在 Linux 上默认使用轮询算法)
二、核心 API 详解
1. 基本方法与属性
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
// 判断当前进程是主进程还是工作进程
if (cluster.isMaster) {
console.log(`主进程 ${process.pid} 正在运行`);
// 衍生工作进程(通常按CPU核心数)
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
// 监听工作进程退出事件
cluster.on('exit', (worker, code, signal) => {
console.log(`工作进程 ${worker.process.pid} 已退出`);
// 可选:自动重启
cluster.fork();
});
} else {
// 工作进程可以共享同一个TCP连接
http.createServer((req, res) => {
res.writeHead(200);
res.end('你好世界\n'