Skip to content

重试、熔断与过载接纳 ​

超时重试、熔断隔离与容量控制 ​

前置:理解请求到达时间、处理耗时、并发数与速率的区别;Python 3.10+ 用于离线准入模型。教学范围为请求型SLI/错误预算;SRE Workbook2018;Python 3.10+。核对日期2026-10-17。示例未执行,本轮没有安装依赖、生成协议代码、启动服务或浏览器预览。完整文件与输入见令牌与并发门槛完整推演;推演结论只适用于写明的模型。

超时重试与放大 ​

超时重试与放大需要总截止时间、重试次数和退避约束。三层每层最多尝试三次(含首次)可能把一次业务请求放大成27次下游尝试。若每层是首次加重试三次,则最多为4³=64次。只重试可恢复错误并确认幂等,随机抖动缓解同步冲击;超时不证明服务端没有副作用。

断路器三种状态 ​

断路器三种状态是关闭时放行并统计,打开时快速拒绝,半开时限制探测。失败恢复不只靠等固定秒数,需限制探测并发和成功条件。断路器保护依赖,重试尝试完成请求,两者可组合但职责不同。

隔离与降级契约 ​

隔离与降级契约通过舱壁限制故障扩散,例如独立线程池或并发配额。缓存降级可能返回过期数据,必须标注时间与业务允许范围;支付确认不能因为推荐服务可降级就照搬返回默认成功。降级本身也要可观测。

容量计算与安全余量 ​

容量计算与安全余量先固定工作负载:到达率λ=120请求/秒,每个请求独占一个worker平均40毫秒,因此单worker服务率μ=25请求/秒。8个worker的理想上界cμ=200请求/秒,利用率ρ=120/200=60%。若规定只使用理想能力的75%,可接纳150请求/秒,余下50请求/秒是能力余量;当前流量距接纳上限还有30请求/秒,两种“余量”不能混称。为120请求/秒保留同样比例至少需要ceil(120/(25×0.75))=7个worker。这些是明确假设下的计算,不是实测容量。

在稳定、统计口径一致且长期平均存在的系统中,平均在途数L=λW。若W为仅服务时间40毫秒,平均忙worker数为4.8;若端到端W=100毫秒,则平均系统内请求数为12,包含等待者,不能据此说12个CPU核足够。λ长期超过cμ时积压无法稳定;即使低于上界,长尾、突发、串行锁或其他资源瓶颈仍会扩大等待。安全余量要结合资源测量与尾延迟复核,不能从平均数推出p99保证。依据MIT队列课程对Little定律的讲解及Google SRE过载章节对请求成本和资源容量的限制说明。

令牌桶与过载拒绝 ​

令牌桶与过载拒绝同时限制时间平均速率和瞬时在途量。容量B=2个令牌、补充率r=2令牌/秒的桶初始为满,经过Δt后令牌量为min(B,原量+rΔt),接纳时扣除请求成本;成本大于B的请求永远不能靠等待通过,直接拒绝。并发上限另设为1,在途未结束时即使有令牌仍拒绝;拒绝不扣令牌。令牌桶允许突发,不等于强制每次间隔500毫秒,也不限制某个请求占用worker多久。

本课完整离线模型把1令牌表示为1000个整数credit,毫秒差乘r可精确补充,避免浮点边界漂移。同一时刻先回收结束时间不晚于当前时刻的在途请求,再按输入顺序处理到达;所以完成恰好发生在500毫秒时,500毫秒到达可复用并发名额。模型不排队、不等待、不自动重试,分别输出concurrency_limit、rate_limit和cost_exceeds_capacity及每步剩余量。它是单桶全局教学策略,不是RFC2697的双桶三色标记器,也不是生产限流器。机制参照Go维护者rate包的令牌桶说明、微软中文令牌桶说明与RFC2697计量背景,只静态阅读,没有调用限流库。

断路器与接纳控制的执行分工 ​

断路器依据近期依赖结果决定是否尝试;令牌桶与并发配额决定本服务是否还有能力接纳,两者不可互相替代。下面第一图是通用状态模型,打开后的等待只允许尝试探测,不能证明依赖已恢复。第二图体现本课“不排队、拒绝不扣令牌”的模型。

查看图表代码

速率与并发是两个门槛 ​

令牌充足但 worker 已满时,请求仍被拒绝;worker 空闲但令牌不足时也是如此。接纳时才同时占用并发名额并扣令牌,完成后只释放并发名额,令牌按时间补充。成本超过桶容量的请求不能依靠等待变得可接纳。

查看图表代码

来源与适用边界 ​

微服务熔断与降级示例 ​

从来源文档中剥离的技术说明。示例与约束沿用原文,使用前按实际环境核对。

熔断与降级 ​

使用 Resilience4j(Java)或 opossum(Node.js)实现:

typescript
const breaker = new CircuitBreaker(callOrderService, {
  timeout: 3000,        // 超时 3s
  errorThresholdPercentage: 50,  // 错误率 50% 熔断
  resetTimeout: 30000,  // 30s 后尝试恢复
})

适用范围 ​

配置对应的状态与业务结果 ​

示例展示的是 opossum 风格配置,不能把同一对象直接复制给 Resilience4j。timeout 限制一次调用的等待,resetTimeout 决定打开后何时允许恢复探测;错误比例还需结合实际库的统计窗口和请求量门槛理解。30秒后进入探测不等于自动恢复,底层操作是否被取消也需要调用实现配合。

如果订单查询允许返回缓存,降级响应应带数据时间并说明可能过期;创建订单、扣款和支付确认不能返回伪造成功。库的具体选项需按项目锁定版本查证,本页没有安装库或注入故障。

查看图表代码

继续阅读