参考文档
熔断器配置
熔断器(Circuit Breaker)是 Claude Code Hub 的核心保护机制,用于自动检测和隔离故障供应商,防止级联失败影响整体服务可用性。本文档详细介绍熔断器的工作原理、配置参数和最佳实践。
概述
熔断器模式源自电路保护器的设计思想:当检测到异常时自动"断开",保护系统免受持续故障的影响。在 Claude Code Hub 中,每个供应商都有独立的熔断器实例,当某个供应商连续失败达到阈值时,熔断器会自动"打开",后续请求将跳过该供应商,转而使用其他可用供应商。
独立熔断器
每个供应商拥有独立的熔断器,互不影响。一个供应商的熔断不会影响其他供应商的正常使用。
状态机详解
熔断器采用三态状态机模型,通过状态转换实现故障检测和自动恢复。
状态转换图
失败次数 >= 阈值
┌───────────────────────────────────────┐
│ ▼
┌───────┐ ┌─────────┐
│CLOSED │ │ OPEN │
│ 正常 │ │ 熔断 │
└───┬───┘ └────┬────┘
│ │
│ 成功次数 >= 恢复阈值 │ 熔断时间到期
│ ▼
│ ┌───────────┐
└───────────────────────────────│ HALF-OPEN │
│ 探测 │
└───────────┘
CLOSED(关闭/正常)状态
这是熔断器的默认状态,表示供应商运行正常。
状态特征:
- 所有请求正常转发到该供应商
- 系统持续监控请求成功/失败情况
- 每次成功请求会重置失败计数器
状态转换条件:
- 当失败次数累计达到
circuitBreakerFailureThreshold时,转换到 OPEN 状态
OPEN(打开/熔断)状态
当供应商连续失败达到阈值后,熔断器进入此状态,起到保护作用。
状态特征:
- 请求不会转发到该供应商(被选择器跳过)
- 系统会自动选择其他可用供应商
- 状态持续
circuitBreakerOpenDuration毫秒
状态转换条件:
- 当熔断持续时间到期后,自动转换到 HALF-OPEN 状态
- 管理员可通过手动重置立即关闭熔断器
熔断告警
当熔断器打开时,系统会自动发送告警通知(如已配置)。告警信息包含供应商名称、失败次数和预计恢复时间。
HALF-OPEN(半开/探测)状态
熔断时间到期后的过渡状态,用于验证供应商是否已恢复正常。
状态特征:
- 允许少量请求通过,测试供应商是否恢复
- 系统会记录这些探测请求的成功/失败情况
- 根据探测结果决定后续状态
状态转换条件:
- 连续成功次数达到
circuitBreakerHalfOpenSuccessThreshold时,转换到 CLOSED 状态 - 如果探测请求失败,重新转换到 OPEN 状态
配置参数
熔断器支持供应商级别的独立配置,可在供应商管理页面为每个供应商设置不同的参数。
circuitBreakerFailureThreshold
失败阈值 - 触发熔断所需的连续失败次数。
| 属性 | 值 |
|---|---|
| 类型 | 整数 |
| 默认值 | 5 |
| 推荐范围 | 3-10 |
| 数据库字段 | circuit_breaker_failure_threshold |
说明:
- 较低的阈值(如 3)可以更快检测到故障,但可能导致误熔断
- 较高的阈值(如 10)更保守,但故障检测速度较慢
- 建议根据供应商的稳定性历史进行调整
circuitBreakerOpenDuration
熔断持续时间 - 熔断器保持 OPEN 状态的时长(毫秒)。
| 属性 | 值 |
|---|---|
| 类型 | 整数 |
| 默认值 | 1800000(30 分钟) |
| 推荐范围 | 60000-3600000(1-60 分钟) |
| 数据库字段 | circuit_breaker_open_duration |
说明:
- 较短的持续时间可以更快恢复服务,但可能频繁尝试仍不可用的供应商
- 较长的持续时间更保守,但恢复速度较慢
- 可结合智能探测功能实现更快的恢复
circuitBreakerHalfOpenSuccessThreshold
恢复阈值 - HALF-OPEN 状态下需要连续成功的次数才能关闭熔断器。
| 属性 | 值 |
|---|---|
| 类型 | 整数 |
| 默认值 | 2 |
| 推荐范围 | 1-5 |
| 数据库字段 | circuit_breaker_half_open_success_threshold |
说明:
- 较低的阈值(如 1)可以更快恢复正常
- 较高的阈值(如 5)可以更充分验证供应商确实已恢复
自定义熔断规则
可以自定义熔断规则吗? 答案是:可以。Claude Code Hub 支持为每个供应商独立配置熔断器参数,满足不同场景的需求。
配置位置
熔断器参数在供应商管理页面配置:
路径: 设置 > 供应商管理 > 编辑供应商 > 熔断器配置
配置步骤
- 进入「设置」页面,点击「供应商管理」
- 找到需要配置的供应商,点击编辑按钮
- 展开「熔断器配置」折叠区域
- 根据需求调整以下参数:
- 失败阈值:触发熔断所需的连续失败次数
- 熔断时间:熔断器保持打开状态的时长(分钟)
- 恢复阈值:半开状态下需要连续成功的次数
- 点击「保存」按钮完成配置
参数输入范围
在 UI 界面中,各参数的允许输入范围如下:
| 参数 | 最小值 | 最大值 | 默认值 | 单位 |
|---|---|---|---|---|
| 失败阈值 | 1 | 100 | 5 | 次 |
| 熔断时间 | 1 | 1440 | 30 | 分钟 |
| 恢复阈值 | 1 | 10 | 2 | 次 |
单位转换
界面上的「熔断时间」以分钟为单位显示和输入,系统会自动转换为毫秒存储。例如,输入 30 分钟,实际存储为 1800000 毫秒。
配置示例
场景一:高稳定性要求
适用于核心业务供应商,需要更保守的熔断策略:
| 参数 | 配置值 | 说明 |
|---|---|---|
| 失败阈值 | 8 | 允许更多失败次数,避免误熔断 |
| 熔断时间 | 60 | 熔断后等待 1 小时再尝试 |
| 恢复阈值 | 3 | 需要 3 次连续成功才恢复 |
场景二:快速恢复
适用于备用供应商,希望尽快恢复服务:
| 参数 | 配置值 | 说明 |
|---|---|---|
| 失败阈值 | 3 | 快速检测故障 |
| 熔断时间 | 5 | 仅熔断 5 分钟 |
| 恢复阈值 | 1 | 1 次成功即恢复 |
场景三:敏感检测
适用于付费 API 供应商,需要快速发现问题:
| 参数 | 配置值 | 说明 |
|---|---|---|
| 失败阈值 | 2 | 2 次失败即熔断 |
| 熔断时间 | 15 | 熔断 15 分钟 |
| 恢复阈值 | 2 | 2 次成功才恢复 |
配置生效机制
- 即时生效:配置保存后立即生效,无需重启服务
- 配置缓存:配置会缓存在内存中(5 分钟 TTL),减少数据库查询
- Redis 同步:配置同时缓存到 Redis,支持多实例部署场景
- 降级策略:Redis 不可用时自动从数据库读取配置
已打开的熔断器
修改配置不会立即影响已经处于 OPEN 状态的熔断器。已打开的熔断器会按照原配置的时间到期后才进入 HALF-OPEN 状态。如需立即恢复,可使用「可用性监控」页面的手动重置功能。
网络错误处理
网络错误(如 DNS 解析失败、连接超时、代理连接失败)与供应商错误(HTTP 4xx/5xx)有本质区别。系统提供配置选项来控制网络错误是否计入熔断器。
ENABLE_CIRCUIT_BREAKER_ON_NETWORK_ERRORS
环境变量配置 - 控制网络错误是否计入熔断器失败计数。
| 属性 | 值 |
|---|---|
| 类型 | 布尔值 |
| 默认值 | false |
| 配置位置 | .env 文件 |
配置示例:
# 默认关闭:网络错误不计入熔断器
ENABLE_CIRCUIT_BREAKER_ON_NETWORK_ERRORS=false
# 启用:网络错误也计入熔断器
ENABLE_CIRCUIT_BREAKER_ON_NETWORK_ERRORS=true
网络错误类型
系统识别的网络错误包括:
| 错误类型 | 错误码 | 说明 |
|---|---|---|
| DNS 解析失败 | ENOTFOUND | 无法解析供应商域名 |
| 连接被拒绝 | ECONNREFUSED | 目标服务器拒绝连接 |
| 连接超时 | ETIMEDOUT | TCP 连接建立超时 |
| 连接重置 | ECONNRESET | 连接被远程服务器重置 |
| 代理错误 | 多种 | 代理服务器连接或转发失败 |
配置建议
默认关闭(推荐用于不稳定网络环境):
- 适用于使用代理的场景
- 适用于跨境网络环境
- 避免因临时网络抖动触发熔断
启用(适用于稳定网络环境):
- 适用于网络稳定的内网环境
- 连续网络错误也应触发熔断保护
- 避免持续请求不可达的供应商
代理场景注意
如果使用代理访问供应商,建议保持此选项为 false。代理网络不稳定可能导致误熔断。
智能探测
智能探测(Smart Probing)是一项可选功能,当熔断器处于 OPEN 状态时,系统会定期主动探测供应商,实现更快的故障恢复。
工作原理
- 定期检查所有处于 OPEN 状态的熔断器
- 使用轻量级测试请求探测供应商可用性
- 探测成功则提前将熔断器转为 HALF-OPEN 状态
- 允许真实请求逐步验证供应商恢复情况
配置参数
ENABLE_SMART_PROBING
启用智能探测 - 控制是否启用智能探测功能。
| 属性 | 值 |
|---|---|
| 类型 | 布尔值 |
| 默认值 | false |
| 配置位置 | .env 文件 |
PROBE_INTERVAL_MS
探测间隔 - 探测周期的时间间隔(毫秒)。
| 属性 | 值 |
|---|---|
| 类型 | 整数 |
| 默认值 | 30000(30 秒) |
| 推荐范围 | 10000-60000 |
| 配置位置 | .env 文件 |
PROBE_TIMEOUT_MS
探测超时 - 单次探测请求的超时时间(毫秒)。
| 属性 | 值 |
|---|---|
| 类型 | 整数 |
| 默认值 | 5000(5 秒) |
| 推荐范围 | 3000-10000 |
| 配置位置 | .env 文件 |
配置示例:
# 启用智能探测
ENABLE_SMART_PROBING=true
# 每 30 秒探测一次
PROBE_INTERVAL_MS=30000
# 探测超时 5 秒
PROBE_TIMEOUT_MS=5000
探测请求不计入熔断器
智能探测的请求即使失败,也不会计入熔断器的失败计数。这确保探测本身不会延长熔断时间。
状态存储
熔断器使用内存存储运行时状态,配置信息缓存在 Redis 中以优化性能。
内存存储
每个供应商的健康状态存储在内存中:
interface ProviderHealth {
failureCount: number; // 当前失败计数
lastFailureTime: number | null; // 最后失败时间戳
circuitState: "closed" | "open" | "half-open"; // 当前状态
circuitOpenUntil: number | null; // 熔断结束时间戳
halfOpenSuccessCount: number; // 半开状态成功计数
config: CircuitBreakerConfig | null; // 缓存的配置
configLoadedAt: number | null; // 配置加载时间
}
Redis 持久化(v0.3.20+)
从 v0.3.20 版本开始,熔断器状态支持 Redis 持久化存储。当 Redis 可用时,熔断器状态会同步存储到 Redis,实现:
- 多实例状态共享:多个应用实例共享熔断器状态,避免各实例独立计数
- 重启状态保留:应用重启后可从 Redis 恢复熔断器状态,无需重新验证
当 Redis 不可用时,系统自动降级为内存存储模式,应用重启后熔断器状态会重置为 CLOSED。
Redis 配置缓存
供应商的熔断器配置缓存在 Redis 中,键格式为:
circuit_breaker:config:{providerId}
存储内容:
HSET circuit_breaker:config:1
failureThreshold "5"
openDuration "1800000"
halfOpenSuccessThreshold "2"
缓存策略:
| 策略 | 说明 |
|---|---|
| 缓存 TTL | 内存缓存 5 分钟 |
| 降级策略 | Redis 不可用时从数据库读取 |
| 预热机制 | 应用启动时批量加载所有供应商配置 |
监控与告警
熔断器状态监控
可通过以下方式监控熔断器状态:
- 可用性监控页面 - 查看供应商健康状态和熔断器状态
- 日志查看 - 搜索
[CircuitBreaker]关键字查看状态变化 - API 查询 - 通过 Server Actions 获取供应商健康信息
Webhook 通知
系统支持通过企业微信机器人发送熔断告警通知。
配置位置: 设置 > 通知设置 > 熔断器告警
告警内容包含:
- 供应商名称和 ID
- 触发熔断的失败次数
- 预计恢复时间
- 最后一次错误信息
防重复机制:
- 同一供应商 5 分钟内只发送一次告警
- 使用 Redis 缓存实现告警去重
通知配置
需要先在「设置 > 通知设置」中启用通知功能并配置企业微信 Webhook URL。详见 通知设置 文档。
最佳实践
稳定网络配置
适用于网络稳定的生产环境:
# 网络错误计入熔断器
ENABLE_CIRCUIT_BREAKER_ON_NETWORK_ERRORS=true
# 启用智能探测
ENABLE_SMART_PROBING=true
PROBE_INTERVAL_MS=30000
PROBE_TIMEOUT_MS=5000
供应商配置建议:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 失败阈值 | 5 | 默认值即可 |
| 熔断时长 | 1800000(30 分钟) | 配合智能探测可快速恢复 |
| 恢复阈值 | 2 | 默认值即可 |
不稳定网络配置
适用于使用代理或跨境网络环境:
# 网络错误不计入熔断器(避免误熔断)
ENABLE_CIRCUIT_BREAKER_ON_NETWORK_ERRORS=false
# 启用智能探测(加速恢复)
ENABLE_SMART_PROBING=true
PROBE_INTERVAL_MS=60000
PROBE_TIMEOUT_MS=10000
供应商配置建议:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 失败阈值 | 8-10 | 提高阈值避免误熔断 |
| 熔断时长 | 900000(15 分钟) | 缩短时长配合探测 |
| 恢复阈值 | 3 | 适当提高确保稳定恢复 |
多供应商配置
当配置多个供应商时,建议采用差异化配置:
主要供应商(高权重):
- 失败阈值:5-7(相对保守)
- 熔断时长:1800000(30 分钟)
- 原因:主要供应商承载大部分流量,需要更稳定的熔断策略
备用供应商(低权重):
- 失败阈值:3-5(更敏感)
- 熔断时长:900000(15 分钟)
- 原因:备用供应商可以更快熔断和恢复,为主供应商故障时提供保障
故障排查
熔断器频繁打开
可能原因:
- 供应商确实不稳定
- 失败阈值设置过低
- 网络问题被误判为供应商错误
排查步骤:
- 查看请求日志,分析失败原因(HTTP 状态码、错误信息)
- 检查是否为网络错误,考虑关闭
ENABLE_CIRCUIT_BREAKER_ON_NETWORK_ERRORS - 适当提高失败阈值
熔断器不生效
可能原因:
- 熔断器配置未正确保存
- Redis 配置缓存过期未更新
- 应用刚重启,状态被重置
排查步骤:
- 检查供应商配置页面的熔断器参数
- 查看日志中的
[CircuitBreaker]记录 - 清除 Redis 缓存或等待缓存过期(5 分钟)
智能探测不工作
可能原因:
ENABLE_SMART_PROBING未设置为true- 没有处于 OPEN 状态的熔断器
- 探测超时时间过短
排查步骤:
- 检查环境变量配置
- 查看日志中的
[SmartProbe]记录 - 适当增加
PROBE_TIMEOUT_MS
