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错误后直接失败
解决: 指数退避重试
效果: - ✅ 自动处理临时速率限制 - ✅ 避免人工重试 - ✅ 提高成功率
3. 实时监控
问题: 无法看到API调用情况
解决: 实时监控和统计
效果: - ✅ 实时统计 - ✅ 追踪1302错误 - ✅ 数据驱动优化
📋 部署步骤
Step 1: 立即执行(今天)
1.1 验证Redis
1.2 测试速率限制器
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次 | <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分钟
优化: 如果对延迟敏感,可以降低重试次数
🚀 下一步行动
今天
- ✅ 核心组件已创建
- ⏳ 验证Redis连接
- ⏳ 测试速率限制器
- ⏳ 集成到推理模块
本周
- ⏳ 启用监控端点
- ⏳ 配置告警机制
- ⏳ 观察效果(1302错误频率)
本月
- ⏳ 优化并发策略
- ⏳ 成本优化(缓存)
- ⏳ 实现请求队列
📞 支持和故障排查
常见问题
Q1: Redis连接失败
Q2: 速率限制器不工作
Q3: 仍然有1302错误
总结
✅ 核心组件已创建 - 分布式速率限制器 - 智能重试机制 - 实时监控系统
✅ 文档已完善 - 解决方案文档 - 部署指南 - 测试脚本
✅ 预期效果明确 - 1302错误降低90%+ - API成功率>99.5% - 实时监控可见
下一步: 运行 ./test_rate_limit.sh 验证部署,然后集成到现有代码。
部署完成后,请监控1302错误频率,预期每小时从5-10次降至<1次。