node.js通过Cluster模块实现多进程,利用多核CPU提升并发性能。主进程管理worker,各worker共享端口并由系统负载均衡。主进程监控worker状态,崩溃后自动重启,保障服务稳定。默认轮询分发连接,支持IPC通信,便于日志收集与状态监控。建议worker数匹配CPU核心,结合PM2等工具优化部署,应用应无状态或使用外部存储共享数据,避免内存浪费与数据不一致。

Node.js 是单线程的,这意味着一个 node.js 实例只能利用一个 CPU 核心。在多核服务器上,这会造成资源浪费。为了解决这个问题,Node.js 提供了 Cluster 模块,允许你创建多个工作进程(worker processes),每个进程运行在独立的 CPU 核心上,从而提升应用的并发处理能力。
Cluster 模块的基本原理
Cluster 模块基于 child_process 模块实现,它允许主进程(master)创建多个子进程(workers)。这些 worker 进程共享同一个网络端口,能够同时监听和处理 http 请求。操作系统层面会自动将连接分发给不同的 worker,实现负载均衡。
主进程不处理具体业务逻辑,只负责管理 worker 进程:启动、监控、重启失败的进程等。如果某个 worker 崩溃,主进程可以重新启动一个新的,提高系统的稳定性。
如何使用 Cluster 创建多进程服务
下面是一个使用 Cluster 模块启动多个 worker 的简单示例:
const cluster = require(‘cluster’); const http = require(‘http’); const os = require(‘os’); const numCPUs = os.cpus().Length; if (cluster.isMaster) { console.log(`主进程 ${process.pid} 正在运行`); // 创建与 CPU 核心数相同的工作进程 for (let i = 0; i { console.log(`工作进程 ${worker.process.pid} 已退出`); console.log(‘正在重启新的工作进程…’); cluster.fork(); }); } else { // worker 进程:创建 HTTP 服务器 http.createServer((req, res) => { res.writeHead(200); res.end(‘Hello from worker ‘ + process.pid); }).listen(3000); console.log(`工作进程 ${process.pid} 已启动`); }
在这个例子中:
- 主进程通过 cluster.isMaster 判断自身角色,并启动多个 worker。
- 每个 worker 调用 cluster.fork() 创建,它们都监听 3000 端口。
- 主进程监听 ‘exit’ 事件,在 worker 崩溃后自动重启,保证服务可用性。
负载均衡与连接分发
Cluster 模块默认使用轮询方式(round-robin)分发连接,也可以设置为操作系统默认策略。对于大多数 Web 服务来说,默认配置已经足够高效。
如果你希望强制使用轮询调度,可以在 fork 前设置:
cluster.schedulingPolicy = cluster.SCHED_RR;
注意:在 windows 平台或某些系统上,调度策略可能不会生效,系统会自动降级处理。
进程间通信(IPC)
主进程和 worker 之间可以通过内置的 IPC 通道通信。例如,worker 可以向主进程发送日志、状态信息或异常报告。
在 worker 中发送消息:
process.send({ type: ‘log’, data: ‘Worker 正在处理请求’ });
在主进程中监听:
cluster.on(‘message’, (worker, message) => { console.log(`来自 worker ${worker.id}:`, message); });
这种机制适合用于集中式日志收集、健康检查或动态配置更新。
实际部署建议
- 通常建议创建与 CPU 核心数相等的 worker 数量,避免过多进程造成上下文切换开销。
- 结合 PM2 等进程管理工具使用更方便。PM2 内置 cluster 模式,支持零停机重启、日志管理等功能。
- 确保你的应用是无状态的,或使用外部存储(如 redis)共享 session,避免 worker 之间的数据不一致问题。
- 注意内存使用,每个 worker 都是独立的 Node.js 实例,会占用独立内存空间。
基本上就这些。使用 Cluster 模块能有效提升 Node.js 应用的性能和容错能力,尤其适用于高并发的 Web 服务场景。合理配置下,可以充分发挥现代多核服务器的硬件优势。


