Skip to content

轮换与熔断

ccMesh 在多个上游端点之间做请求轮换,并为每个端点配备独立的熔断器,实现「自动切换故障上游、惰性探测恢复」的容错能力。轮换与熔断均按模型过滤:只在支持当前请求模型的端点之间进行。

候选筛选

路由一个请求时,ccMesh 先得到所有「启用且支持该模型」的端点,再用熔断器过滤掉处于 Open(断开) 且未到冷却时间的端点。

兜底策略:若所有候选端点都处于 Open,会放行完整列表,避免出现 100% 拒绝。

轮换策略

ccMesh 维护一个当前端点索引,在候选之间循环前进:

  • 前进规则下一个 = (当前 + 1) % 候选数
  • 连续失败切换:同一端点连续失败达到 2 次后,切换到下一个端点。
  • 最大重试次数启用端点数 × 2,作为单次请求的重试预算上限。

错误的分类与处理

情况处理
HTTP 200成功
HTTP 400 / 401不重试下一个端点(请求本身的问题)
其它 HTTP 状态(5xx / 429 / 403 ...)重试下一个端点
瞬时网络错误(EOF、连接重置、超时等)重试同一端点,延迟 300ms

瞬时网络错误被识别后会先就地短暂重试,而不是立刻切换端点。

熔断器三态

每个端点拥有独立的三态熔断器(请求驱动,无后台轮询):

        失败累计 / 错误率超阈值
 Closed ───────────────────────▶ Open
   ▲                              │ 冷却 timeout 到期(惰性)
   │ 探测成功累计达标               ▼
   └──────────── HalfOpen ◀───────┘
                   │ 探测失败 → 立即重新 Open
                   └────────────────────────▶ Open
  • Closed(闭合):正常放行;记录成功 / 失败。
  • Open(断开):触发后选路跳过该端点;冷却时间到期前不放行。
  • HalfOpen(半开):冷却到期由下一个真实请求惰性进入;单许可只放行一个探测请求,防止雪崩。探测成功累计达标 → 恢复 Closed;探测失败 → 立即重新 Open。

默认熔断参数

参数默认值含义
failure_threshold4连续失败达此次数 → Open
success_threshold2HalfOpen 成功达此次数 → Closed
timeout60sOpen → HalfOpen 的冷却时长
error_rate_threshold0.6错误率阈值(0~1)
min_requests10计算错误率的最小样本数

触发 Open 的两条路径(满足其一即可):

  1. 连续失败 达到 failure_threshold
  2. 错误率 在样本数 ≥ min_requests 时达到 error_rate_threshold

中性结果不污染熔断

并非所有失败都计入熔断。客户端错误(4xx 业务错误,如 400 / 401 / 403 / 422 等) 被归类为 中性(NonRetryable):它们反映的是请求本身的问题而非端点故障,因此只释放半开许可、不计入熔断统计。只有可重试故障(5xx / 429 / 网络错误等,Retryable)才会驱动熔断。

健康状态

熔断器对外暴露每个端点的健康信息:

statuscircuit含义
healthyclosed健康
unhealthyopen熔断中
recoveringhalfOpen探测恢复中

还包括连续失败次数、成功率、最近错误与失败时间等。当代理未运行时,会退化为按端点的 连通性测试 状态粗略映射。

相关