跳转至

API速率限制解决方案部署总结

部署日期: 2026年3月31日 问题: GLM API 1302速率限制错误(每小时5-10次) 本周token消费: 1,460,186,850(约14.6亿)


✅ 已完成的工作

1. 核心组件(已创建)

文件1: backend/common/rate_limiter.py - ✅ DistributedRateLimiter - 分布式速率限制器(基于Redis) - ✅ TokenBucketRateLimiter - 令牌桶限流器 - ✅ rate_limit装饰器 - 便捷装饰器

功能: - 跨进程协调(Redis共享状态) - 阻塞等待机制 - 超时控制 - 实时使用统计

文件2: backend/common/llm_api_wrapper.py - ✅ LLMAPIClient - API客户端包装器 - ✅ call_with_retry - 智能重试机制(指数退避) - ✅ get_llm_client - 全局单例客户端 - ✅ with_rate_limit 和 with_retry 装饰器

功能: - 自动调用GLM API - 自动处理1302错误(重试5次,指数退避) - 集成速率限制 - 监控统计

文件3: backend/common/api_monitor.py - ✅ APIMonitor - 实时监控器 - ✅ APIAlertManager - 告警管理器 - ✅ GlobalAPIMonitor - 全局单例监控器 - ✅ 便捷函数:record_api_call, get_api_stats

功能: - 实时统计API调用 - 追踪速率限制错误 - 每小时告警(超过阈值时) - 提供统计API

2. 文档(已创建)

文档 说明
docs/API_RATE_LIMIT_SOLUTION.md 完整解决方案文档
docs/API_RATE_LIMIT_DEPLOYMENT_GUIDE.md 部署指南
test_rate_limit.sh 测试脚本

🎯 核心特性

1. 分布式速率限制

问题: 多进程并发调用API,无协调

解决: 基于Redis的全局速率限制器

# 所有进程使用相同的Redis
limiter = DistributedRateLimiter(
    max_calls=50,  # 每分钟最多50次
    period=60
)

# 自动协调,避免峰值
limiter.acquire("glm_api", timeout=30)

效果: - ✅ 跨进程协调 - ✅ 平滑请求速率 - ✅ 避免并发峰值

2. 智能重试机制

问题: 1302错误后直接失败

解决: 指数退避重试

# 自动重试1302错误(最多5次)
# 延迟:2s → 4s → 8s → 16s → 32s
response = await client.call_api(messages)

效果: - ✅ 自动处理临时速率限制 - ✅ 避免人工重试 - ✅ 提高成功率

3. 实时监控

问题: 无法看到API调用情况

解决: 实时监控和统计

# 监控端点
GET /api/v1/monitoring/stats
GET /api/v1/monitoring/rate-limit-stats

效果: - ✅ 实时统计 - ✅ 追踪1302错误 - ✅ 数据驱动优化


📋 部署步骤

Step 1: 立即执行(今天)

1.1 验证Redis

docker-compose ps redis

1.2 测试速率限制器

./test_rate_limit.sh

1.3 集成到现有代码

在每个LLM API调用处:

# 添加导入
from common.llm_api_wrapper import get_llm_client, GLMRateLimitException

# 使用包装器
client = get_llm_client()
response = await client.call_api(messages)

重点文件: - backend/services/reasoning/base.py - backend/services/reasoning/cot.py - backend/services/reasoning/react.py - backend/services/reasoning/graph_rag.py

Step 2: 本周完成

2.1 启用监控 - 添加监控初始化 - 添加监控端点 - 配置定期日志

2.2 配置告警 - 设置告警阈值(每小时20次) - 配置告警渠道(邮件/钉钉/企业微信)

2.3 优化参数 - 根据实际情况调整max_calls_per_minute - 监控效果,动态调整


🎯 预期效果

部署前

每小时1302错误: 5-10次
API成功率: 95-98%
请求峰值: 不受控,多进程并发
监控: 无

部署后

每小时1302错误: <1次(降低90%+)
API成功率: >99.5%
请求峰值: 平滑控制
监控: 实时可见
重试: 自动处理

📊 监控指标

关键指标

指标 部署前 部署后 说明
每小时1302错误 5-10次 <1次 主要目标
API成功率 95-98% >99.5% 可靠性
平均响应时间 未知 统计可见 性能
Token消费 14.6亿/周 跟踪 成本

监控端点

# 查看统计
curl http://localhost:8001/api/v1/monitoring/stats

# 查看速率限制统计
curl http://localhost:8001/api/v1/monitoring/rate-limit-stats?window_minutes=60

# 重置统计
curl -X POST http://localhost:8001/api/v1/monitoring/reset-stats

⚠️ 注意事项

1. Redis依赖

要求: Redis必须运行

检查: docker-compose ps redis

启动: docker-compose up -d redis

2. 速率限制阈值

当前设置: 每分钟50次(保守值)

调整方法: 根据实际情况调整

# 在 .env 中设置
GLM_API_MAX_CALLS_PER_MINUTE=50  # 可调整

# 或在代码中设置
client = get_llm_client(max_calls_per_minute=100)

建议: - 初期:30-50(保守) - 稳定后:50-80(正常) - 高峰期:80-100(最大)

3. 重试超时

当前设置: 最多重试5次,最长等待60秒

影响: 1302错误时,可能需要等待1-2分钟

优化: 如果对延迟敏感,可以降低重试次数


🚀 下一步行动

今天

  1. ✅ 核心组件已创建
  2. ⏳ 验证Redis连接
  3. ⏳ 测试速率限制器
  4. ⏳ 集成到推理模块

本周

  1. ⏳ 启用监控端点
  2. ⏳ 配置告警机制
  3. ⏳ 观察效果(1302错误频率)

本月

  1. ⏳ 优化并发策略
  2. ⏳ 成本优化(缓存)
  3. ⏳ 实现请求队列

📞 支持和故障排查

常见问题

Q1: Redis连接失败

# 检查Redis
docker-compose ps redis

# 重启Redis
docker-compose restart redis

Q2: 速率限制器不工作

# 清空Redis速率限制数据
redis-cli FLUSHDB

# 重启服务
docker-compose restart backend

Q3: 仍然有1302错误

# 降低每分钟调用次数
# 编辑 .env
GLM_API_MAX_CALLS_PER_MINUTE=30


总结

核心组件已创建 - 分布式速率限制器 - 智能重试机制 - 实时监控系统

文档已完善 - 解决方案文档 - 部署指南 - 测试脚本

预期效果明确 - 1302错误降低90%+ - API成功率>99.5% - 实时监控可见

下一步: 运行 ./test_rate_limit.sh 验证部署,然后集成到现有代码。


部署完成后,请监控1302错误频率,预期每小时从5-10次降至<1次。