重试、幂等与补偿:重复执行怎样安全收敛
重试改变调用次数,幂等和补偿决定最终业务状态。
Resilience4j 的 Retry 文档 明确最大尝试次数包含首次调用,并支持结果/异常分类与退避函数。
失效现场:局部保护为什么仍会放大故障
网关、服务和 SDK 各自重试三次,一次请求最多放大为 27 次叶子调用;超时写操作没有幂等键,重复扣款后只能人工修复。 先保存请求时间线、依赖状态、资源水位和权威业务结果,区分产品失败、保护拒绝、基础设施失败和结果未知。
权威语义与量化预算
重试 owner 只设一层,并按连接失败、明确拒绝、结果未知和永久错误分类;幂等记录与业务写入同一原子边界,缓存去重不能作为权威。 最大尝试、单次预算、总 deadline、退避上限和 jitter 范围共同约束;补偿不是删除记录,而是可审计的新业务动作及可重试状态机。 正向路径证明承诺成立,反向路径注入慢、拒绝、断连、强杀和恢复,禁止用自动重跑覆盖首次现场。
六段可靠性主链
Failure classify
在 Failure classify 阶段声明 owner、输入、状态、截止时间、容量、失败码和下一动作。正向实验产生唯一权威结果,反向实验越过边界并断言拒绝、隔离或恢复可见;任何后台工作都必须在请求结束、超时或停机后拥有明确归宿。
Retry budget
在 Retry budget 阶段声明 owner、输入、状态、截止时间、容量、失败码和下一动作。正向实验产生唯一权威结果,反向实验越过边界并断言拒绝、隔离或恢复可见;任何后台工作都必须在请求结束、超时或停机后拥有明确归宿。
Backoff / jitter
在 Backoff / jitter 阶段声明 owner、输入、状态、截止时间、容量、失败码和下一动作。正向实验产生唯一权威结果,反向实验越过边界并断言拒绝、隔离或恢复可见;任何后台工作都必须在请求结束、超时或停机后拥有明确归宿。
Idempotency ledger
在 Idempotency ledger 阶段声明 owner、输入、状态、截止时间、容量、失败码和下一动作。正向实验产生唯一权威结果,反向实验越过边界并断言拒绝、隔离或恢复可见;任何后台工作都必须在请求结束、超时或停机后拥有明确归宿。
Authoritative state
在 Authoritative state 阶段声明 owner、输入、状态、截止时间、容量、失败码和下一动作。正向实验产生唯一权威结果,反向实验越过边界并断言拒绝、隔离或恢复可见;任何后台工作都必须在请求结束、超时或停机后拥有明确归宿。
Compensation
在 Compensation 阶段声明 owner、输入、状态、截止时间、容量、失败码和下一动作。正向实验产生唯一权威结果,反向实验越过边界并断言拒绝、隔离或恢复可见;任何后台工作都必须在请求结束、超时或停机后拥有明确归宿。
可靠性从失败语义开始,而不是从组件清单开始
调用失败至少分为未开始、明确失败、执行中断、结果未知和已成功但响应丢失。连接被拒绝通常说明服务端未执行,读取超时却可能发生在提交之后;统一捕获异常然后重试,会把不确定性变成重复副作用。每个端口定义稳定结果码、是否可重试、幂等要求、权威查询和补偿入口,框架异常只作为证据而不是业务契约。
deadline 必须穿过线程、连接、网络和重试
相对超时在每层重新开始会扩张总等待,绝对 deadline 才能让剩余预算单调递减。池等待、DNS/连接/TLS、写入、首字节、响应体和业务执行分别设上限,但上限取剩余预算与局部安全值的较小者。进入重试前重新计算剩余时间,若已不足以完成一次安全尝试就直接终止。
重试必须有单一 owner、放大预算和幂等账本
熔断、隔离、限流和降级解决不同问题
健康、就绪和停机必须对应平台动作
故障注入用权威状态计算 RTO、RPO 和爆炸半径
可靠性指标必须区分产品失败与保护动作
故障实验需要证明机制确实接管
依赖治理把事故经验变成门禁
两个 Java 17 模型固定故障见证
离线模型只压缩状态机和量化判据,真实工程再用 Resilience4j、Spring Boot、数据库、消息系统与平台生命周期验证同一不变量。
javac --release 17 -Xlint:all -Werror examples/backend-development/reliability/retry-idempotency-compensation/RetryAmplificationDemo.java examples/backend-development/reliability/retry-idempotency-compensation/IdempotencyLedgerDemo.java
java -cp examples/backend-development/reliability/retry-idempotency-compensation RetryAmplificationDemo
java -cp examples/backend-development/reliability/retry-idempotency-compensation IdempotencyLedgerDemolayers=3 attemptsPerLayer=3 leafCalls=27 singleOwnerCalls=3 amplificationReduced=24
operation=pay-17 deliveries=3 businessWrites=1 first=COMMITTED duplicate1=REPLAY duplicate2=REPLAY converged=true发布、回滚与恢复门禁
围绕“只有瞬时且幂等安全的失败进入有限重试,重复由权威账本吸收,补偿拥有明确终态”保存配置版本、依赖图、基线、故障时间线、权威数据差异、RTO/RPO 和停止条件。发布必须在正常、慢、失败、结果未知和恢复五阶段通过;恢复后还要证明积压归零、重复被吸收、保护状态稳定且没有第二波流量冲击。
