生命周期与运维:热更、重启、优雅关停

生命周期与运维:热更、重启、优雅关停

这一章关注“能长期跑”:配置变更如何生效、出现异常如何修复、进程退出如何收口,决定了系统能不能稳定上线。

你需要掌握的要点

  • 变更不是“文件一改就重启”:应先分类(可热更/需重启/无影响)
  • 重启不是黑盒:需要交接信息让用户在原会话看到结果
  • 关停必须按稳定顺序收尾:先停副作用来源,再广播,再关网络

1) 配置变更分类:hot reload / restart / noop

建议把“变更如何生效”做成明确规则,而不是文件变化就一律重启:

  • hot reload:可不停进程应用(例如纯运行态策略变更)
  • restart:必须重启才能生效(例如底层依赖需要重建)
  • noop:无影响(避免抖动)

2) 延迟重启直到空闲(defer until idle)

对生产/长任务场景,建议把重启做成“可等待的动作”:

  • 统计当前活动任务与队列情况
  • 在超时窗口内尽量等到空闲再触发重启
  • 超时后给出明确结果(继续重启或放弃)

3) 重启交接(sentinel):让重启结果对用户可见

重启不应是黑盒。建议用“交接文件/哨兵”在旧进程与新进程之间传递:

  • 谁请求了重启、为何重启
  • 是否重启成功、何时恢复

这样用户可以在原会话看到“已重启/重启失败”的结果,而不是只看到连接断开。

4) 优雅关停:稳定顺序比“能关掉”更重要

建议把关停步骤固定为可重复执行的顺序:

  1. 先停发现/暴露与副作用来源(避免新连接与新任务)
  2. 再停 channels / plugins / watchers(停止外部输入与扩展)
  3. 广播 shutdown(让客户端可见)
  4. 最后关闭 ws/http(收口网络)

失败场景与排障入口

  • “任何小改动都触发重启”:先确认 reload plan 是否做了 hot/restart/noop 分类;再对照 Gateway 配置日志 看变更路径与决策。
  • 重启后用户只看到断线:检查是否有“重启交接信息”(sentinel)把结果回填到原会话;并在 Control UI / 日志 里确认重启链路是否完整。
  • 关停后仍有残留任务/端口占用:按“先停副作用 → 再广播 → 最后关网络”的顺序排查;必要时用 Doctor故障排除 做诊断闭环。

验收清单

  1. 小改动不会引发频繁重启(noop/hot/restart 分类正确)。
  2. 重启会尽量等待空闲,且超时有明确行为。
  3. 重启后用户能看到可读结果(交接信息生效)。
  4. 关停顺序稳定,不会出现“半关停半运行”的悬挂状态。

相关入口(站内):

读源码入口(可选)

  • src/gateway/config-reload.ts
  • src/gateway/server-reload-handlers.ts
  • src/infra/restart.ts
  • src/gateway/server-restart-sentinel.ts
  • src/infra/restart-sentinel.ts
  • src/gateway/server-close.ts