超时与端到端预算:截止时间怎样沿调用链递减
超时不是局部定时器,而是端到端失败契约。
Amazon Builders' Library 的 Timeouts, retries and backoff with jitter 说明超时并不表示副作用未发生。
失效现场:局部保护为什么仍会放大故障
入口允许 800 ms,下游连接、池等待和读取各配置 500 ms,串联调用可等待数秒;客户端超时重试时,第一次写入可能已经提交。 先保存请求时间线、依赖状态、资源水位和权威业务结果,区分产品失败、保护拒绝、基础设施失败和结果未知。
权威语义与量化预算
入口建立绝对 deadline,每层只消费剩余预算;提交前可取消,提交边界后把超时标为结果未知并通过 operationId 查询权威状态。 预算表显式分配排队、连接、首字节、执行、提交与返回,并为取消和对账保留余量;记录超时阶段而不只记录 TimeoutException。 正向路径证明承诺成立,反向路径注入慢、拒绝、断连、强杀和恢复,禁止用自动重跑覆盖首次现场。
六段可靠性主链
Ingress deadline
在 Ingress deadline 阶段声明 owner、输入、状态、截止时间、容量、失败码和下一动作。正向实验产生唯一权威结果,反向实验越过边界并断言拒绝、隔离或恢复可见;任何后台工作都必须在请求结束、超时或停机后拥有明确归宿。
Pool wait
在 Pool wait 阶段声明 owner、输入、状态、截止时间、容量、失败码和下一动作。正向实验产生唯一权威结果,反向实验越过边界并断言拒绝、隔离或恢复可见;任何后台工作都必须在请求结束、超时或停机后拥有明确归宿。
Connect
在 Connect 阶段声明 owner、输入、状态、截止时间、容量、失败码和下一动作。正向实验产生唯一权威结果,反向实验越过边界并断言拒绝、隔离或恢复可见;任何后台工作都必须在请求结束、超时或停机后拥有明确归宿。
Execute
在 Execute 阶段声明 owner、输入、状态、截止时间、容量、失败码和下一动作。正向实验产生唯一权威结果,反向实验越过边界并断言拒绝、隔离或恢复可见;任何后台工作都必须在请求结束、超时或停机后拥有明确归宿。
Commit unknown
在 Commit unknown 阶段声明 owner、输入、状态、截止时间、容量、失败码和下一动作。正向实验产生唯一权威结果,反向实验越过边界并断言拒绝、隔离或恢复可见;任何后台工作都必须在请求结束、超时或停机后拥有明确归宿。
Cancel / reconcile
在 Cancel / reconcile 阶段声明 owner、输入、状态、截止时间、容量、失败码和下一动作。正向实验产生唯一权威结果,反向实验越过边界并断言拒绝、隔离或恢复可见;任何后台工作都必须在请求结束、超时或停机后拥有明确归宿。
可靠性从失败语义开始,而不是从组件清单开始
deadline 必须穿过线程、连接、网络和重试
取消不是抛出 TimeoutException 即结束:任务可能仍在线程、数据库或远端执行。同步调用传播 interrupt/cancel 并释放连接,异步调用关联 future 与底层请求,消息和写操作在提交边界后改为对账。迟到结果不能写回已复用的请求上下文,也不能覆盖新的业务版本。
重试必须有单一 owner、放大预算和幂等账本
熔断、隔离、限流和降级解决不同问题
健康、就绪和停机必须对应平台动作
故障注入用权威状态计算 RTO、RPO 和爆炸半径
可靠性指标必须区分产品失败与保护动作
故障实验需要证明机制确实接管
依赖治理把事故经验变成门禁
两个 Java 17 模型固定故障见证
离线模型只压缩状态机和量化判据,真实工程再用 Resilience4j、Spring Boot、数据库、消息系统与平台生命周期验证同一不变量。
javac --release 17 -Xlint:all -Werror examples/backend-development/reliability/timeout-budget/DeadlinePropagationDemo.java examples/backend-development/reliability/timeout-budget/LateResultDemo.java
java -cp examples/backend-development/reliability/timeout-budget DeadlinePropagationDemo
java -cp examples/backend-development/reliability/timeout-budget LateResultDemobudgetMs=800 elapsedMs=125 poolMs=75 connectMs=100 executeMs=420 remainingMs=80 exhausted=false
deadlineMs=500 commitAtMs=480 responseAtMs=620 client=TIMEOUT server=COMMITTED reconcile=SUCCEEDED duplicatePrevented=true发布、回滚与恢复门禁
围绕“所有下游等待共享同一绝对截止时间,超时后取消昂贵工作并把结果未知交给权威状态对账”保存配置版本、依赖图、基线、故障时间线、权威数据差异、RTO/RPO 和停止条件。发布必须在正常、慢、失败、结果未知和恢复五阶段通过;恢复后还要证明积压归零、重复被吸收、保护状态稳定且没有第二波流量冲击。
