第 31 章 / 共 51 章
卷四 · 热重载深潜(卷末)
边界与反模式:热重载不是万能锤
知道"什么时候不该用"和知道"怎么用"同样重要。卷四收官:把所有边界汇总成一张表,再用真实攻击样本检验系统的韧性。
本章导读
站位:卷四的"负面清单"。反模式都来自真实场景——drill 演练的攻击样本、func_test 的风暴用例、以及把热重载误当部署工具的常见倾向。
31.1 引入
热重载解决的是"业务代码的在线更新"。它不解决:进程结构的变更(端点/线程模型)、非脚本资源的重建、也不适合承担高频发布。判断式很简单——变更若只涉及"脚本内容 + 证书 + 同端点配置",走 reload;其余走重启。把这条边界刻在运维手册里,比记住十个细节更有用。
31.2 不可变项汇总
| 变更项 | reload 结果 | 正确路径 |
|---|---|---|
engine.workers | FAILED(拒绝) | 重启进程 |
| 监听不可变字段(recv_limit 等) | FAILED(明确拒绝) | 重启进程 |
| 端点结构变更(class/ip/port 组合变化不可 handoff) | FAILED(提示降级) | 重启;或拆成两个 server 滚动 |
| custom 类服务的脚本 | 不支持在线重载 | 重启(raw 资源无终态 lease) |
| 新增 / 删除 custom server | 不支持 | 重启 |
| 脚本内容 / 证书 / 同端点配置 | SUCCEEDED | reload(这正是它的职责) |
注意 custom 类的位置:它把连接与资源完全交给应用,宿主拿不到"什么时候安全"的信号——所以诚实地说"不支持",而不是给一个不安全的开关。需要热更新的业务请放在 http/ws/tcp/udp 四类上。
31.3 重载炸弹与韧性
drill 演练的攻击样本清单里有一项专门针对热重载:坏脚本重载炸弹——循环提交含编译错误的脚本(样本是连发 6 次),配合 func_test 的 20 连发风暴用例,验证三个韧性点:
重载炸弹(坏脚本 ×N 连发)
├── 每次意图:FAILED + Message 指明编译错误 /* 拒绝是干净的 */
├── 旧代全程原样服务 /* 拒绝不伤在线 */
└── latest-wins 吸收并发风暴 /* 队列不堆积 */
配套保护:pending ≤64(打满 Submit 返回 0)
结果环 256(审计不无限增长)
好脚本在坏脚本之后立即提交 → 一次成功即恢复
这个样本存在的意义:重载面是攻击面——上面的管理路由鉴权(ch27)挡住外部触发;而机制本身保证即使内部人手滑,坏输入也只能换来干净的拒绝。
31.4 反模式集
| 反模式 | 症状 | 正解 |
|---|---|---|
| 每秒 reload(当部署系统) | 编译开销堆积、GC 队列变长 | 重载是变更不是发布;高频迭代用 dev 环境重启 |
| Swap 塞进整库数据 | 换代变慢、快照巨肥 | 大块数据放 db/文件(天然跨代);Swap 只带轻量状态 |
| 跨代共享裸指针"省事" | 偶发 UAF | 值交接(Swap)或全局单例资源 + 显式生命周期 |
| 用 reload 恢复"内存怪状态" | 治标不治本,问题复现 | 先修因;重载不该是玄学重置按钮(尽管它经常"管用") |
| 生产环境开自动文件触发 | 编辑器自动保存 = 意外上线 | 自动触发只用于 dev;生产走带鉴权的管理路由 |
31.5 契约
- 边界线:脚本/证书/同端点配置 → reload;结构/线程/custom → 重启。
- 韧性线:坏输入 = 干净拒绝 + 旧代无损 + 队列有界。
- 纪律线:重载频率与 Swap 体量保持"人级"(分钟级变更、KB 级快照)。
常见错误
想用 reload 改端口
- 症状
- FAILED,Message 提示结构变更。
- 原因
- 端点变更需要监听重建——线上安全地换监听需要新端口过渡(双 server 滚动)或重启。这不是缺陷而是诚实的边界。
给 custom 服务找 reload
- 症状
- 文档/直觉都说能重载,实际没有路径。
- 原因
- custom 类的连接与资源完全归应用管——宿主无法判断安全点。把需要热更的业务放进四类协议服务,custom 留给真正特殊的场景。
编程练习
基础边界巡检表
逐项触发 31.2 表的变更,记录每条的 reload 结果信息。
验收:六行全部实证;每条拒绝都带明确 Message。
进阶炸弹复现
复刻重载炸弹:20 连发坏脚本 + 中途插入一个好脚本,全程压测。
验收:20 FAILED + 1 SUCCEEDED;压测零失败;好脚本上线即时生效。
挑战滚动换端口
设计并实现"不停机改端口"的方案(提示:临时双 server + 客户端切换 + 收尾)。
验收:全程可用率 100%;写清每一步的回退手段。
小结
| 要点 | 结论 |
|---|---|
| 判断式 | 脚本/证书/同端点配置 → reload;其余重启 |
| 不可变项 | workers、监听字段、端点结构、custom 类 |
| 韧性 | 坏输入干净拒绝、旧代无损、队列有界 |
| 纪律 | 分钟级变更、KB 级快照、生产禁自动触发 |
| 卷四结 | 模型→触发→交接→时序→GC→边界:热重载闭环完成 |
本章涉及的 API 参考
xrt 延伸阅读
- xrt 教程 · HTTP 服务端 — 服务端韧性的库层视角(超时与攻击防御)