标准答案

  1. 先让实例从流量入口或消费者分配中退出,再停止接收新工作,给已有请求和消息处理留出截止时间。
  2. 应用要正确接收信号、关闭监听、完成或取消在途操作,并保证重复投递或中断恢复是安全的。
  3. 运行时停止超时不能短于业务合理排空时间,否则最终会强杀进程。
  4. 停机测试要覆盖长请求、消息处理中断、数据库事务、重试和重新启动后的恢复。

题目解析

停止容器时,运行时发送 SIGTERM 后会等待一段时间再强杀,但业务是否安全取决于平台摘流、应用停止 accept、消费者停止拉取、事务提交和任务恢复。已建立的连接和已领取的消息不会因为容器被标记删除就自动完成。

正确做法是先让实例不再接新工作,再在 deadline 内完成或取消在途请求;消息只在结果可靠保存后确认,无法完成的工作要安全重投递。停机时间不能只靠调大 timeout,必须有幂等、持久化中间状态、重启恢复和观测指标。

常见误区

  • 误区:只把 stop timeout 调大。改正:先摘流、停止新工作并设计恢复边界,再按真实排空时间设置 timeout。
  • 误区:收到 SIGTERM 直接退出。改正:关闭监听、等待在途工作并按 deadline 释放连接和子进程。
  • 误区:不测试处理到一半的消息。改正:演练中断、重投递、重复执行和最终对账。

作者信息