导航
目标只有一个:
在不影响用户使用的情况下完成代码升级。
早期很多人理解成:
在同一个进程里替换代码
但现代工程认为:
这是危险且不必要的
因为在 Node.js 中做热更新代码, 牵扯到的点可能主要是 require 会有一个 cache, 有这个 cache 在, 即使你更新了 .js 文件, 在代码中再次 require 还是会拿到之前的编译好缓存在 v8 内存 (code space) 中的的旧代码. 但是如果只是单纯的清除掉 require 中的 cache, 再次 require 确实能拿到新的代码, 但是这时候很容易碰到各地维持旧的引用依旧跑的旧的代码的问题. 如果还要继续推行这种热更新代码的话, 可能要推翻当前的架构, 从头开始从新设计一下目前的框架.
因为系统运行时存在大量状态:
你无法知道:
谁还在使用旧代码
于是会产生:
新代码 + 旧状态
这比重启更可怕。
核心思想:
不用替换
直接再开一份新的
流程:
用户几乎无感知。
当执行:
pm2 reload app
内部:
fork 新 worker
负载均衡把新请求导向新 worker
旧 worker 等待连接结束
退出
因为请求可能从:
旧进程 → 新进程
如果登录信息、会话在内存:
❌ 就丢了。
所以状态统一放:
因为它带来:
稳定性最高。
下面这部分,是高级工程师思维。
因为:
都会遇到: