健康、就绪与优雅启停:实例怎样安全接入和退出流量
活着、能接流量和能完成在途工作是三种不同状态。
Spring Boot Application Availability 区分 liveness/readiness;Graceful Shutdown 在关闭早期拒绝新请求并处理在途请求。
失效现场:局部保护为什么仍会放大故障
liveness 同时检查数据库,数据库故障触发所有实例重启并加重连接风暴;停机只等待 HTTP,却在途消息仍被强杀后重复投递。 先保存请求时间线、依赖状态、资源水位和权威业务结果,区分产品失败、保护拒绝、基础设施失败和结果未知。
权威语义与量化预算
startup 保护慢初始化,liveness 只判断进程无法自愈的内部损坏,readiness 表达当前是否接流;HTTP、消息、调度和异步任务分别排空。 平台 termination grace 包含 PreStop 与应用关闭,必须大于退流传播、最长允许请求和资源关闭之和;超期任务进入可恢复状态而非无限等待。 正向路径证明承诺成立,反向路径注入慢、拒绝、断连、强杀和恢复,禁止用自动重跑覆盖首次现场。
六段可靠性主链
Startup probe
在 Startup probe 阶段声明 owner、输入、状态、截止时间、容量、失败码和下一动作。正向实验产生唯一权威结果,反向实验越过边界并断言拒绝、隔离或恢复可见;任何后台工作都必须在请求结束、超时或停机后拥有明确归宿。
Liveness
在 Liveness 阶段声明 owner、输入、状态、截止时间、容量、失败码和下一动作。正向实验产生唯一权威结果,反向实验越过边界并断言拒绝、隔离或恢复可见;任何后台工作都必须在请求结束、超时或停机后拥有明确归宿。
Readiness
在 Readiness 阶段声明 owner、输入、状态、截止时间、容量、失败码和下一动作。正向实验产生唯一权威结果,反向实验越过边界并断言拒绝、隔离或恢复可见;任何后台工作都必须在请求结束、超时或停机后拥有明确归宿。
Refuse traffic
在 Refuse traffic 阶段声明 owner、输入、状态、截止时间、容量、失败码和下一动作。正向实验产生唯一权威结果,反向实验越过边界并断言拒绝、隔离或恢复可见;任何后台工作都必须在请求结束、超时或停机后拥有明确归宿。
Drain in-flight
在 Drain in-flight 阶段声明 owner、输入、状态、截止时间、容量、失败码和下一动作。正向实验产生唯一权威结果,反向实验越过边界并断言拒绝、隔离或恢复可见;任何后台工作都必须在请求结束、超时或停机后拥有明确归宿。
Close resources
在 Close resources 阶段声明 owner、输入、状态、截止时间、容量、失败码和下一动作。正向实验产生唯一权威结果,反向实验越过边界并断言拒绝、隔离或恢复可见;任何后台工作都必须在请求结束、超时或停机后拥有明确归宿。
可靠性从失败语义开始,而不是从组件清单开始
deadline 必须穿过线程、连接、网络和重试
重试必须有单一 owner、放大预算和幂等账本
多层重试的最坏调用数按各层尝试次数相乘。入口、服务、SDK 和消息系统只能有一个明确 owner 执行主动重试,其余层向上传递稳定失败。退避减少连续冲击,jitter 打散实例同步,但都不能增加总 deadline;随机源需要可观察 seed 或区间,使事故能够重放。
熔断、隔离、限流和降级解决不同问题
健康、就绪和停机必须对应平台动作
startup 表示初始化是否完成,liveness 表示进程内部是否无法自愈,readiness 表示是否愿意接收新流量。把数据库、缓存等外部依赖放进 liveness 会在依赖故障时触发全体重启;readiness 也不能因每个可选依赖抖动而频繁摘挂。探针需要低开销、超时、连续阈值和自身指标,UNKNOWN 与明确失败分开。
停机先发布 REFUSING_TRAFFIC 并等待路由收敛,再停止 HTTP 接入、暂停消息拉取和调度,排空在途工作,最后关闭连接、Exporter 和线程。平台宽限期从终止开始计时并包含 PreStop;应用关闭预算必须留出强杀前余量。未完成任务保存可恢复检查点,不能为了“优雅”无限延长占用。
故障注入用权威状态计算 RTO、RPO 和爆炸半径
可靠性指标必须区分产品失败与保护动作
故障实验需要证明机制确实接管
依赖治理把事故经验变成门禁
两个 Java 17 模型固定故障见证
离线模型只压缩状态机和量化判据,真实工程再用 Resilience4j、Spring Boot、数据库、消息系统与平台生命周期验证同一不变量。
javac --release 17 -Xlint:all -Werror examples/backend-development/reliability/health-start-stop/AvailabilityStateDemo.java examples/backend-development/reliability/health-start-stop/GracefulDrainDemo.java
java -cp examples/backend-development/reliability/health-start-stop AvailabilityStateDemo
java -cp examples/backend-development/reliability/health-start-stop GracefulDrainDemostates=[STARTING, LIVE_NOT_READY, READY, REFUSING, STOPPED] illegalTransitions=0 trafficOnlyWhenReady=true
inFlight=12 completed=10 timedOut=2 newRejected=5 graceMs=30000 drainMs=28000 forcedKill=false发布、回滚与恢复门禁
围绕“实例只在初始化完成后接流,退流先拒绝新工作再排空在途任务,并在平台强杀前关闭资源”保存配置版本、依赖图、基线、故障时间线、权威数据差异、RTO/RPO 和停止条件。发布必须在正常、慢、失败、结果未知和恢复五阶段通过;恢复后还要证明积压归零、重复被吸收、保护状态稳定且没有第二波流量冲击。
