关闭是一个序列
顺序很重要:先让就绪失败,给负载均衡器时间停止路由,再关闭监听器。如果进程在就绪状态传播前关闭监听器,仍会有客户端向即将消失的 socket 发送请求。
处理器必须幂等。多个信号或慢关闭期间的新信号不应启动第二次排空或重置截止时间。跟踪状态,并只记录一次原因。
SIGTERM -> readiness 503 -> close listener -> drain active requests -> exit 0
\-> deadline exceeded -> exit 1
测试排空,而不只是退出
向空闲服务器发送 SIGTERM 的测试证明不了什么。启动一个耗时数秒的请求,发送 SIGTERM,验证请求完成、排空期间就绪返回 503,且进程以预期码退出。再让请求超过截止时间来验证强制退出路径。
与平台协调
排空截止时间应低于编排器的宽限期;如果平台不能快速摘除实例,添加 pre-stop 延迟。把数值写入部署清单,避免未来修改宽限期时静默截断排空。
验证关闭
预期结果:收到 SIGTERM 后新请求不再被接受,进行中请求在截止时间内完成,进程以 0 退出;超时任务触发 1。用负载测试和信号注入验证,并检查日志中只有一次关闭序列。