Node.js项目开启多进程的2种方案

发布于:2025-04-15 ⋅ 阅读:(12) ⋅ 点赞:(0)

当node项目只部署一个单进程单实例时,遇到异常发生后程序会崩溃,此时杀掉进程在重启单这段时间会导致服务不能正常使用,这显然会影响用户体验。

所以需要以多进程的模式去部署应用,这样当某一个进程发生异常重启时,此时有其他请求被接受后,其他进程依旧可以对外提供服务,当然前提是你的应用不能够异常多的数不过来。

一、在Node.js应用中使用cluster模块

1、Cluster 核心机制

原理‌:主进程(Master)创建多个子进程(Worker),共享同一个 TCP 端口,Master 通过 Round-robin 算法分配请求。

优势‌:

  • 多核 CPU 利用率提升 200%~300%
  • 高并发场景下请求处理能力翻倍
  • 单个 Worker 崩溃时自动重启保障服务可用性

通过合理使用 Cluster 模块,可使 Node.js 应用的并发处理能力提升 3 倍以上。建议通过压力测试工具(如 autocannon)验证实际性能提升效果。

2、基础使用

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

// 主进程逻辑
if (cluster.isMaster) {
  console.log(`主进程 PID: ${process.pid}`);

  // 根据 CPU 核心数创建 Worker
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  // Worker 异常退出时自动重启
  cluster.on('exit', (worker, code, signal) => {
    console.log(`Worker ${worker.process.pid} 退出`);
    cluster.fork(); // 重新创建 Worker
  });

// Worker 进程逻辑
} else {
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('请求由 Worker ' + process.pid + ' 处理');
  }).listen(3000);

  console.log(`Worker 进程 PID: ${process.pid} 已启动`);
}

关键 API 

cluster.isMaster 判断当前进程是否为主进程
cluster.fork() 创建新的 Worker 进程(最多建议创建 CPU 核心数 × 1.5 个)[^4]
cluster.on('exit') 监听 Worker 退出事件
worker.process.pid 获取 Worker 的进程 ID

3、进阶用法 

<