CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
Node.js 运行时进阶/课时/Cluster 与多进程
RawBlame
课时目录12 节

Node.js 运行时进阶

  1. 01运行时进阶概览
  2. 02定时器与 nextTick
  3. 03回调与错误栈
  4. 04子进程
  5. 05Worker Threads
  6. 06Cluster 与多进程
  7. 07垃圾回收
  8. 08调试 Node
  9. 09APM 与生产监控
  10. 10CLI 工具链
  11. 11global 与内置模块
  12. 12综合练习

Cluster 与多进程

cluster、keep-app-running。

30 分钟

Cluster 与多进程

单个 Node 进程默认 用一个 CPU 核跑 Event Loop。nrt-worker 解决线程级 CPU;cluster 模块让 多个 Node 进程共享同一端口,利用多核处理并发连接——经典「keep app running」模式。

学习目标

  • 理解 master/worker(primary/worker)角色与端口复用
  • 知道 cluster 与 PM2、容器多副本的关系
  • 避免把有状态 session blindly 假设在单进程

基本 cluster 模板

import cluster from "node:cluster";
import http from "node:http";
import os from "node:os";

if (cluster.isPrimary) {
  const n = os.availableParallelism();
  console.log(`primary ${process.pid}, forking ${n} workers`);

  for (let i = 0; i < n; i++) {
    cluster.fork();
  }

  cluster.on("exit", (worker, code) => {
    console.log(`worker ${worker.process.pid} exited ${code}`);
    cluster.fork(); // 可选:自动重启
  });
} else {
  http.createServer((req, res) => {
    res.end(`worker ${process.pid}\n`);
  }).listen(3000);
}

OS 会在 primary 监听的端口上做 负载均衡(Linux 默认 round-robin 接受连接)。

生产环境现实

  • PM2 cluster mode、Kubernetes 多 Pod 副本 是更常见的运维层多进程方案——原理类似:N 个独立进程 + 前面负载均衡。
  • Nest / Express 无内置 session 亲和时,内存 session 会丢——用 Redis(见 nestjs-essentials)或 sticky session。
  • 零停机重启:primary 先 fork 新 worker,再 SIGTERM 旧 worker——PM2 / 容器滚动更新更省心。

cluster vs worker_threads vs child

方案粒度共享适用
cluster多进程不共享堆HTTP 多核、进程隔离
worker_threads多线程可选 SABCPU 计算
fork 单个子进程1+ 进程IPC跑脚本、隔离崩溃

不要在 cluster worker 里再 fork 大量子进程——进程数爆炸。

健康检查与 keep-alive

多 worker 下任一 worker crash,primary 可 cluster.fork() 补位;但 反复 crash 要限流,避免 fork 风暴。

配合 nrt-apm 上报 按 worker pid 分维度 的错误率与 heap。

练习

  • 跑上文 HTTP 示例,用 curl 多次请求观察不同 pid
  • 故意在 worker 里 process.exit(1),看 primary 是否重启(若你实现了 fork)
  • 对比「单进程 + Node --watch」与「4 worker 无 watch」的压测 QPS 直觉(ab 或 autocannon 即可)

小结

cluster 让多核吃满 HTTP 连接;状态要外置,重启要有策略。 下一课垃圾回收——看懂 heap 与泄漏从哪查起。

加载本节练习…
← 上一课Worker Threads下一课 →垃圾回收