独家合作CubenceAI 中转平台立减 10%访问

代理功能

多维度限流

Claude Code Hub 实现了一套完整的多维度限流系统,在 User(用户)Key(API Key)Provider(供应商) 三个层面进行精细化控制,确保资源合理分配、成本可控。

限流层级

限流检查按以下优先级执行:

  1. 永久硬限制 - 总消费上限(Lifetime Limit)
  2. 资源保护 - 并发会话数、RPM(每分钟请求数)
  3. 短期周期限制 - 5小时滚动窗口、日限额
  4. 中长期周期限制 - 周限额、月限额

限流维度概览

维度限制类型作用范围说明
总消费限额硬限制User / Key终身累计消费上限,达到后完全禁止访问
RPM 限制频率限制User每分钟请求数上限,防止高频滥用
并发会话资源限制User / Key / Provider同时进行的对话会话数量上限
5小时滚动窗口成本限制User / Key过去5小时内的累计消费上限
日限额成本限制User / Key每日消费上限,支持固定时间或滚动24小时模式
周限额成本限制User / Key自然周(周一 00:00 开始)消费上限
月限额成本限制User / Key自然月(1日 00:00 开始)消费上限

限流检查顺序

系统按照精心设计的顺序执行限流检查(rate-limit-guard.ts):

Layer 1 - 永久硬限制(最先检查)
  1. Key 总消费限额
  2. User 总消费限额

Layer 2 - 资源/频率保护
  3. Key 并发会话数
  4. User 并发会话数
  5. User RPM 限制

Layer 3 - 短期周期限制
  6. Key 5小时滚动窗口
  7. User 5小时滚动窗口
  8. Key 日限额
  9. User 日限额

Layer 4 - 中长期周期限制
  10. Key 周限额
  11. User 周限额
  12. Key 月限额
  13. User 月限额

设计原则

  • 硬限制优先于周期限制,确保成本绝对可控
  • 同一窗口内,Key 限制先于 User 限制检查
  • 资源保护类限制位置靠前,及时拦截异常流量
  • 高触发概率的限制优先检查,减少无效计算

RPM 限制(Requests Per Minute)

RPM 限制用于控制用户的请求频率,防止高频滥用。

实现机制

  • 滑动窗口算法:使用 Redis ZSET 存储请求时间戳,精确统计过去60秒内的请求数
  • 并发安全:使用 Redis Pipeline 批量操作,确保高并发场景下的准确性
  • 自动清理:2分钟 TTL 自动清理过期数据

配置方式

在用户管理界面设置 RPM 限制 字段:

RPM 限制: 60  # 表示每分钟最多 60 次请求

设为 0 或留空表示不限制。

触发时的响应

当 RPM 限制触发时,请求会被拒绝,返回 HTTP 429 状态码:

{
  "error": {
    "message": "Rate limit exceeded: User RPM limit reached (60/60)",
    "type": "rate_limit_error",
    "code": "429"
  }
}

成本限制(Cost-Based Limiting)

成本限制基于实际消费金额进行控制,支持多种时间窗口类型。

时间窗口类型

窗口类型计算方式适用场景
5小时滚动过去5小时的累计消费短期爆发控制
日限额 - 固定从配置的重置时间开始24小时按自然日结算
日限额 - 滚动过去24小时的累计消费平滑流量
周限额自然周(周一 00:00 至下周一 00:00)周度预算控制
月限额自然月(1日 00:00 至下月1日 00:00)月度预算控制

日限额重置模式

系统支持两种日限额重置模式:

固定时间模式(Fixed)

  • 在配置的每日重置时间点重置计数
  • 例如:设置重置时间为 18:00,则每天 18:00 重置
  • 适合有固定结算时间点的场景

滚动窗口模式(Rolling)

  • 统计过去24小时的累计消费
  • 无固定重置时间点,平滑计算
  • 适合需要连续流量控制的场景

配置示例

日限额: $50.00
日重置模式: 固定
日重置时间: 00:00

周限额: $300.00
月限额: $1000.00
5小时限额: $20.00

并发会话限制

并发会话限制控制同时进行的对话数量,防止资源被单个用户或 Key 独占。

会话生命周期

  1. 会话创建 - 首次请求时创建会话记录
  2. 会话活跃 - 每次请求更新会话时间戳
  3. 会话过期 - 5分钟无活动后自动过期
  4. 会话清理 - Redis ZSET 自动清理过期成员

配置建议

场景建议限制说明
个人用户3-5正常使用场景
团队用户10-20多人共享账号
API Key1-3按 Key 粒度控制
供应商50-150防止单一供应商过载

注意

供应商级别的并发限制在 Provider 选择阶段原子性检查,不经过 rate-limit-guard。这确保了在并发场景下的准确性。

Lease 机制(租赁配额)

为了提升高并发场景下的性能,系统采用 Lease(租赁)机制减少数据库查询。

工作原理

  1. 获取租赁:从数据库批量获取一段配额(如总限额的 5%)
  2. 本地扣减:请求消费从租赁配额中扣减,无需访问数据库
  3. 租赁刷新:租赁耗尽或过期时,重新从数据库获取
  4. 原子操作:使用 Redis Lua 脚本确保扣减的原子性

租赁配置

通过系统设置配置租赁参数:

quotaLeasePercent5h: 5%      # 5小时限额的租赁比例
quotaLeasePercentDaily: 5%   # 日限额的租赁比例
quotaLeasePercentWeekly: 5%  # 周限额的租赁比例
quotaLeasePercentMonthly: 5% # 月限额的租赁比例
quotaLeaseCapUsd: 10.0       # 单次租赁金额上限(可选)
quotaDbRefreshIntervalSeconds: 10  # 租赁刷新间隔

性能优化

Lease 机制将高频的数据库查询转换为低频的批量获取,在高并发场景下可显著提升性能。租赁比例和上限可根据实际业务调整。

Fail-Open 策略

当 Redis 不可用时,系统采用 Fail-Open 策略:允许请求通过,而不是阻断服务。

设计哲学

  • 可用性优先:确保核心代理功能不受影响
  • 优雅降级:限流功能失效时,系统继续提供服务
  • 及时告警:所有 Fail-Open 情况都会记录 WARN 级别日志

降级行为

功能Redis 可用时Redis 不可用时
RPM 检查正常限制允许通过
成本限制Redis + Lease回退到数据库查询
并发会话Redis ZSET允许通过
租赁扣减原子 Lua 脚本允许通过

运维建议

虽然 Fail-Open 确保了服务连续性,但 Redis 故障期间限流功能会失效。建议:

  1. 配置 Redis 监控告警
  2. 尽快恢复 Redis 服务
  3. 考虑部署 Redis 哨兵或集群提高可用性

响应头信息

系统在响应中返回限流相关的 HTTP 头:

响应头说明示例
X-RateLimit-Limit当前限制的总量100
X-RateLimit-Remaining剩余配额85
X-RateLimit-Reset重置时间(ISO 8601)2026-01-29T16:00:00Z

环境变量配置

限流功能通过以下环境变量控制:

# 启用限流(默认 true)
ENABLE_RATE_LIMIT=true

# Redis 连接(必需)
REDIS_URL=redis://localhost:6379

# 可选:Redis TLS 配置
REDIS_TLS_REJECT_UNAUTHORIZED=false

最佳实践

1. 分层设置限额

User 级别:
  - 月限额: $500(硬上限)
  - 周限额: $150(预警)
  - 日限额: $50(日常控制)
  - 5小时: $15(短期爆发)

Key 级别:
  - 月限额: $200(子账号控制)
  - 日限额: $20(细粒度)

2. RPM 设置建议

  • 标准模型(如 Claude 3.5 Sonnet):60-120 RPM
  • 轻量模型(如 GPT-3.5):120-300 RPM
  • 批处理场景:根据实际并发需求调整

3. 监控与告警

关注以下指标:

  • 限流触发频率(各维度)
  • Redis 连接状态
  • 租赁刷新频率
  • Fail-Open 事件次数

4. 测试限流

使用脚本测试限流是否生效:

# 快速发送多个请求测试 RPM 限制
for i in {1..70}; do
  curl -s -o /dev/null -w "%{http_code}\n" \
    -H "Authorization: Bearer YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{"model":"claude-3-5-sonnet","messages":[{"role":"user","content":"hi"}]}' \
    http://localhost:23000/v1/chat/completions
done

故障排查

限流未生效

  1. 检查 ENABLE_RATE_LIMIT 是否为 true
  2. 检查 Redis 连接是否正常
  3. 检查用户/Key 的限额配置是否大于 0
  4. 查看日志中的 [RateLimit] 相关记录

误触发限流

  1. 检查是否有其他请求共享同一 User/Key
  2. 检查并发会话是否包含已过期但未清理的会话
  3. 验证系统时间是否同步

Redis 性能问题

  1. 检查 Redis 内存使用情况
  2. 考虑调整租赁参数减少查询频率
  3. 监控 Redis 慢查询日志

相关文档

Previous
熔断器