标准答案

  1. 先将实例标记为未就绪并等待负载均衡传播,避免继续接收新请求。
  2. 停止接收新任务和消息,等待短任务完成;长任务应取消、转移或保存状态,不能无限等待。
  3. 关闭前提交已成功处理的位点,未完成消息让它重新投递或进入可恢复状态,并抑制停机期间的重试风暴。
  4. 设置总停机 deadline,最后关闭连接池、线程池和日志,启动探针验证下一实例已接管。

题目解析

优雅停机是一个有顺序的状态转换:先摘除流量并等待传播,再停止接收新请求和消息,最后在 deadline 内处理或转移在途工作。顺序错误会让新任务不断进入,导致永远停不下来。

HTTP 请求、后台任务和消息消费有不同的完成语义。短请求可以等待,长任务要取消或保存状态,未确认消息要让系统重新投递;提交位点前必须确认对应工作已经完成。

停机验证要看探针、连接池、线程池、消费者位点、重试和未完成任务。超时后应执行明确的强制关闭和恢复路径,不能无限等待一个失控任务。

常见误区

  • 误区:先杀进程再期待消息系统恢复。改正:先停止接收、保存或让未完成消息重新投递,再按 deadline 关闭。
  • 误区:只停止 HTTP,不停止后台任务。改正:同时暂停定时器、消费者和异步执行器,处理它们的在途状态。
  • 误区:停机期间继续接受新消息。改正:先摘除实例并确认就绪状态传播,再关闭入口。

作者信息