Spring Boot 优雅停机实战:30 秒内完成流量排干 + 任务收尾 + 资源释放
去年大促前一晚,我们做例行发布。CI/CD 流水线一把梭:kubectl rollout restart,30 个 Pod 滚动更新,5 分钟搞定。 结果第二天复盘时,运维同学甩过来三张截图: 网关日志:滚动更新期间 472 个 502 Bad Gateway,全是打在被重启的实例上 业务日志:3 笔订单状态更新了一半,扣了库存没写流水,DBA 手工对账到凌晨两点 MQ 后台:某 Topic 出现 2000+ 条重复消费,下游幂等兜底差点没扛住 根因说起来特别简单:K8s 给 Pod 的默认宽限期是 30 秒,超时后直接 SIGKILL。我们的应用既没开优雅停机,也没配 preStop,JVM 收到 SIGTERM 后根本没机会"把手头的事做完"——在途请求直接断、定时任务跑一半、MQ 消息没提交 offset。 这不是个例。只要你的服务跑在 K8s 上,滚动更新、扩缩容、节点驱逐,每一刻都可能触发"杀进程"。优雅停机就是给应用一个"临终遗嘱"的执行机会:先摘流量 → 再处理完在途请求 → 然后停任务 → 最后释放资源,全程 30 秒内干净退出。 这篇文章把我们踩过的坑和最终落地的....