轮换与熔断
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_threshold | 4 | 连续失败达此次数 → Open |
success_threshold | 2 | HalfOpen 成功达此次数 → Closed |
timeout | 60s | Open → HalfOpen 的冷却时长 |
error_rate_threshold | 0.6 | 错误率阈值(0~1) |
min_requests | 10 | 计算错误率的最小样本数 |
触发 Open 的两条路径(满足其一即可):
- 连续失败 达到
failure_threshold; - 错误率 在样本数 ≥
min_requests时达到error_rate_threshold。
中性结果不污染熔断
并非所有失败都计入熔断。客户端错误(4xx 业务错误,如 400 / 401 / 403 / 422 等) 被归类为 中性(NonRetryable):它们反映的是请求本身的问题而非端点故障,因此只释放半开许可、不计入熔断统计。只有可重试故障(5xx / 429 / 网络错误等,Retryable)才会驱动熔断。
健康状态
熔断器对外暴露每个端点的健康信息:
| status | circuit | 含义 |
|---|---|---|
healthy | closed | 健康 |
unhealthy | open | 熔断中 |
recovering | halfOpen | 探测恢复中 |
还包括连续失败次数、成功率、最近错误与失败时间等。当代理未运行时,会退化为按端点的 连通性测试 状态粗略映射。
