导航


HTML

CSS

JavaScript

浏览器 & 网络

版本管理

框架

构建工具

TypeScript

性能优化

算法

UI、组件库

Node

业务技能

针对性攻坚

AI

公共类


一、什么是热更新?

目标只有一个:

在不影响用户使用的情况下完成代码升级。


早期很多人理解成:

在同一个进程里替换代码

但现代工程认为:

这是危险且不必要的

因为在 Node.js 中做热更新代码, 牵扯到的点可能主要是 require 会有一个 cache, 有这个 cache 在, 即使你更新了 .js 文件, 在代码中再次 require 还是会拿到之前的编译好缓存在 v8 内存 (code space) 中的的旧代码. 但是如果只是单纯的清除掉 require 中的 cache, 再次 require 确实能拿到新的代码, 但是这时候很容易碰到各地维持旧的引用依旧跑的旧的代码的问题. 如果还要继续推行这种热更新代码的话, 可能要推翻当前的架构, 从头开始从新设计一下目前的框架.


二、为什么在进程内替换代码几乎不可行?

因为系统运行时存在大量状态:

你无法知道:

谁还在使用旧代码

于是会产生:

新代码 + 旧状态

这比重启更可怕。


三、现代解决方案:优雅重启(Graceful Reload)

核心思想:

不用替换
直接再开一份新的

流程:

  1. 新进程启动(加载新代码)
  2. 停止旧进程接收新流量
  3. 等旧请求执行完
  4. 回收旧进程

用户几乎无感知。


四、PM2 / cluster 的实现步骤

当执行:

pm2 reload app

内部:

Step 1

fork 新 worker

Step 2

负载均衡把新请求导向新 worker

Step 3

旧 worker 等待连接结束

Step 4

退出


五、为什么这要求服务必须“无状态”

因为请求可能从:

旧进程 → 新进程

如果登录信息、会话在内存:

❌ 就丢了。


所以状态统一放:


六、为什么这已经成为行业标准?

因为它带来:

稳定性最高。


架构视角

下面这部分,是高级工程师思维。


为什么 Java / Go / Node 最终走向同一条路?

因为:

只要是常驻进程

都会遇到: