PM2 运行原理
PM2 的核心运行原理是一个常驻后台的守护进程(Daemon) 加上进程间远程调用(RPC) 的架构。它通过这种设计,将进程管理命令与实际运行的应用解耦,实现了强大的进程守护、集群管理和零停机重载等功能。
它的运行原理可以从以下几个核心方面来理解:
🏗️ 核心架构:Client-Daemon 两进程模型
PM2 主要由两个核心进程协同工作:
-
守护进程 (Daemon):这是 PM2 的“大脑”和“心脏”,是一个在后台独立运行、永不退出的进程。它负责管理和监控所有由 PM2 启动的应用进程。当你执行
pm2 start后,真正启动和管理应用的都是这个守护进程。它的核心实现位于 PM2 源码的lib/Daemon.js和lib/God目录下。 -
客户端进程 (Client):这是你每次在终端输入
pm2命令时短暂运行的进程(如pm2 start app.js)。它的任务很简单:通过 RPC (远程过程调用) 与守护进程通信,将你的指令(启动、停止、重启等)发送给守护进程去执行,执行完毕后客户端进程通常就退出了。
当你第一次运行 PM2 命令时,客户端会检查守护进程是否存在,如果没有,它会自动通过
spawn方式创建并启动一个守护进程。
⚙️ 启动流程:一个命令的旅程
以 pm2 start app.js 为例,其完整的执行流程如下:
- 命令解析:
pm2CLI 命令被解析,调用API模块中对应的方法。 - 连接守护进程:
Client模块与后台的Daemon进程建立 RPC 通信连接。 - 发送指令:
Client将“启动应用”的命令及其配置(如app.js)通过 RPC 发送给Daemon。 - 创建子进程:
Daemon接收到命令后,其核心的God模块开始工作。它会根据配置(fork 或 cluster 模式)使用 Node.js 的child_process.fork或cluster.forkAPI 来创建子进程,从而运行你的应用。
至此,你的应用就在 PM2 守护进程的管理下运行了。
🚀 集群模式 (Cluster Mode) 与负载均衡
PM2 的一个核心优势是内置了负载均衡器。其**集群模式(Cluster Mode)**能让 Node.js 应用充分利用多核 CPU 的能力。
- 实现原理:PM2 的集群模式基于 Node.js 内置的
cluster模块。当你使用pm2 start app.js -i max时,PM2 会创建一个主进程(Master)和多个工作进程(Worker)。主进程负责监听端口并接收所有请求,然后通过负载均衡算法(默认为 Round-Robin,即轮询算法)将请求分发给各个工作进程处理。 - 使用方式:通过
-i参数指定实例数。pm2 start app.js -i max会自动启动与 CPU 核心数相同的进程数。
♻️ 进程守护与自动重启
这是 PM2 作为进程管理器的基本盘。守护进程会持续监控所有子进程的状态。一旦任何一个子进程因为未捕获的异常、系统错误等原因崩溃退出,守护进程会立即根据配置自动重启一个新的进程来替代它,从而保证服务始终在线。
✨ 零停机重载 (Zero-Downtime Reload)
与直接 restart(粗暴地杀死并重启所有进程,会导致短暂服务中断)不同,reload 命令可以实现无缝更新。
它的工作方式是:逐个重启集群模式下的工作进程。它会先启动一个新的工作进程,待新进程成功接管流量后,再优雅地关闭一个旧的工作进程。这个过程逐一进行,始终保证有足够多的进程在提供服务,从而实现零停机更新。
📝 总结
PM2 通过 Client-Daemon 的 RPC 架构实现了解耦与稳定通信;其核心能力源于对 Node.js cluster 模块的封装,提供了集群模式和负载均衡;在此基础上,通过进程守护和零停机重载等特性,为 Node.js 应用提供了生产级的进程管理方案。