故障注入、RTO/RPO、演练与回滚:恢复能力怎样被证明
恢复目标必须由可控故障和权威业务水位验收。
Kubernetes 容器生命周期钩子 说明 PreStop 与终止宽限期关系,适合校准强杀边界而非替代业务恢复验证。
失效现场:局部保护为什么仍会放大故障
演练只证明 Pod 会重启,没有验证未确认消息、已提交未响应订单和副本落后;平台恢复 11 分钟后仍有三条数据差异,却被记为 RTO 达标。 先保存请求时间线、依赖状态、资源水位和权威业务结果,区分产品失败、保护拒绝、基础设施失败和结果未知。
权威语义与量化预算
RTO 从故障发生到关键服务恢复,完整恢复另记对账完成;RPO 用权威提交序列与恢复后状态比较,不能用日志最后时间粗略代替。 实验限定租户/分片/实例和持续时间,预设错误率、积压、数据差异和安全告警停止条件;回滚路径在故障前准备并保持独立可用。 正向路径证明承诺成立,反向路径注入慢、拒绝、断连、强杀和恢复,禁止用自动重跑覆盖首次现场。
六段可靠性主链
Steady state
在 Steady state 阶段声明 owner、输入、状态、截止时间、容量、失败码和下一动作。正向实验产生唯一权威结果,反向实验越过边界并断言拒绝、隔离或恢复可见;任何后台工作都必须在请求结束、超时或停机后拥有明确归宿。
Fault hypothesis
在 Fault hypothesis 阶段声明 owner、输入、状态、截止时间、容量、失败码和下一动作。正向实验产生唯一权威结果,反向实验越过边界并断言拒绝、隔离或恢复可见;任何后台工作都必须在请求结束、超时或停机后拥有明确归宿。
Blast radius
在 Blast radius 阶段声明 owner、输入、状态、截止时间、容量、失败码和下一动作。正向实验产生唯一权威结果,反向实验越过边界并断言拒绝、隔离或恢复可见;任何后台工作都必须在请求结束、超时或停机后拥有明确归宿。
Inject
在 Inject 阶段声明 owner、输入、状态、截止时间、容量、失败码和下一动作。正向实验产生唯一权威结果,反向实验越过边界并断言拒绝、隔离或恢复可见;任何后台工作都必须在请求结束、超时或停机后拥有明确归宿。
RTO / RPO
在 RTO / RPO 阶段声明 owner、输入、状态、截止时间、容量、失败码和下一动作。正向实验产生唯一权威结果,反向实验越过边界并断言拒绝、隔离或恢复可见;任何后台工作都必须在请求结束、超时或停机后拥有明确归宿。
Rollback proof
在 Rollback proof 阶段声明 owner、输入、状态、截止时间、容量、失败码和下一动作。正向实验产生唯一权威结果,反向实验越过边界并断言拒绝、隔离或恢复可见;任何后台工作都必须在请求结束、超时或停机后拥有明确归宿。
可靠性从失败语义开始,而不是从组件清单开始
端到端可靠性同时约束成功、失败和恢复。成功路径要在 deadline 内完成并产生权威状态;失败要有界拒绝、隔离和可行动原因;恢复要证明积压排空、重复吸收、数据对账和保护状态回归。只看到实例重新 UP 或熔断器 CLOSED,不能证明业务已经恢复。
deadline 必须穿过线程、连接、网络和重试
重试必须有单一 owner、放大预算和幂等账本
熔断、隔离、限流和降级解决不同问题
HALF_OPEN 是受控实验,只放少量探针并避免所有实例同时恢复;成功阈值、探针业务代表性和恢复迟滞决定是否关闭熔断。降级数据标记来源、新鲜度、缺失能力和禁止使用的业务场景,不能把缓存旧值伪装成实时结果。保护机制自身配置错误时要有 forced-open、disable 或回滚路径,但管理操作需鉴权审计和到期。
健康、就绪和停机必须对应平台动作
故障注入用权威状态计算 RTO、RPO 和爆炸半径
先定义稳态和假设,例如“数据库主连接中断时,关键读在 30 秒内降级,写入不丢失且恢复后 10 分钟内对账”。实验限定租户、分片、实例、持续时间和权限,设立即停止条件;注入网络延迟、断连、进程终止、磁盘满、时钟偏差或依赖慢时,确认故障真正生效而非只看工具成功。
RTO 从故障发生到约定服务水平恢复,完整恢复另记积压和对账完成;RPO 比较故障前权威提交序列与恢复后数据。监控恢复、实例恢复和业务恢复是三条时间线。回滚也必须在依赖不健康、数据库迁移中途或旧版本不兼容时验证,不能假定部署系统按一下就能回到安全状态。
可靠性指标必须区分产品失败与保护动作
故障实验需要证明机制确实接管
每个实验同时放置不受影响的对照组,确认变化来自注入而非环境波动。断网要证明目标连接实际失败,延迟要证明服务端执行与客户端观察都增加,进程终止要区分优雅 TERM 与强制 KILL,磁盘满要验证具体写路径而非临时目录。注入未命中也应使实验失败,不能把“无异常”解释为系统可靠。
修复验收复用相同 fault、seed、流量和数据边界:修改前稳定违反不变量,修改后保护在预算内触发并恢复,同时正常路径开销不越界。演练产物保留事件时间线、配置、依赖版本、Trace、权威数据快照和停止原因;成功摘要不能覆盖中途发生的额外影响。
依赖治理把事故经验变成门禁
例外记录精确规则、影响路径、风险 owner、补偿控制、到期和删除证据;过期自动阻断。每次生产事故反向更新错误分类、依赖图、爆炸系数和最小回归演练。门禁不追求机制数量,而证明在正常、慢、拒绝、结果未知和恢复五个阶段,系统都给出有界、可解释、可对账的状态。
两个 Java 17 模型固定故障见证
离线模型只压缩状态机和量化判据,真实工程再用 Resilience4j、Spring Boot、数据库、消息系统与平台生命周期验证同一不变量。
javac --release 17 -Xlint:all -Werror examples/backend-development/reliability/failure-injection-rto-rpo/RecoveryObjectiveDemo.java examples/backend-development/reliability/failure-injection-rto-rpo/BlastRadiusDemo.java
java -cp examples/backend-development/reliability/failure-injection-rto-rpo RecoveryObjectiveDemo
java -cp examples/backend-development/reliability/failure-injection-rto-rpo BlastRadiusDemofaultAtMin=0 detectedAtMin=2 serviceAtMin=11 reconciledAtMin=14 rtoMin=11 fullRecoveryMin=14 rpoRecords=3
tenants=100 experimentTenants=5 maxAffected=5 observedAffected=4 abortThreshold=5 contained=true发布、回滚与恢复门禁
围绕“每次演练有稳态、爆炸半径、停止条件和权威恢复证据,RTO/RPO 由时间线与数据差异实际计算”保存配置版本、依赖图、基线、故障时间线、权威数据差异、RTO/RPO 和停止条件。发布必须在正常、慢、失败、结果未知和恢复五阶段通过;恢复后还要证明积压归零、重复被吸收、保护状态稳定且没有第二波流量冲击。
