第 31 章 / 共 51 章
卷四 · 热重载深潜(卷末)

边界与反模式:热重载不是万能锤

知道"什么时候不该用"和知道"怎么用"同样重要。卷四收官:把所有边界汇总成一张表,再用真实攻击样本检验系统的韧性。

本章导读

站位:卷四的"负面清单"。反模式都来自真实场景——drill 演练的攻击样本、func_test 的风暴用例、以及把热重载误当部署工具的常见倾向。

31.1 引入

热重载解决的是"业务代码的在线更新"。它不解决:进程结构的变更(端点/线程模型)、非脚本资源的重建、也不适合承担高频发布。判断式很简单——变更若只涉及"脚本内容 + 证书 + 同端点配置",走 reload;其余走重启。把这条边界刻在运维手册里,比记住十个细节更有用。

31.2 不可变项汇总

变更项reload 结果正确路径
engine.workersFAILED(拒绝)重启进程
监听不可变字段(recv_limit 等)FAILED(明确拒绝)重启进程
端点结构变更(class/ip/port 组合变化不可 handoff)FAILED(提示降级)重启;或拆成两个 server 滚动
custom 类服务的脚本不支持在线重载重启(raw 资源无终态 lease)
新增 / 删除 custom server不支持重启
脚本内容 / 证书 / 同端点配置SUCCEEDEDreload(这正是它的职责)

注意 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 延伸阅读