共计 1341 个字符,预计需要花费 4 分钟才能阅读完成。
背景痛点
在实际开发中,直接调用 ChatGPT API 会遇到几个典型问题:

-
速率限制 :官方 API 对 RPM(每分钟请求数) 和 TPM(每分钟 token 数)都有严格限制,当业务量突增时容易触发 429 错误。
-
长尾响应:AI 生成内容具有不确定性,某些复杂请求可能耗时 10 秒以上,导致客户端超时。
-
地域封锁:部分地区的网络访问不稳定,需要智能路由切换。
架构设计
对比常见解决方案:
- 反向代理:简单但缺乏灵活控制
- 服务网格:过重且学习成本高
- 动态代理模式:轻量级且可编程性强
我们采用分层架构:
graph TD
A[客户端] --> B[代理层]
B --> C[路由决策]
C --> D[API 节点 1]
C --> E[API 节点 2]
C --> F[缓存层]
核心实现(Python 示例)
请求签名与鉴权
def generate_signature(api_key, timestamp):
# 使用 HMAC-SHA256 防止篡改
h = hmac.new(api_key.encode(), timestamp.encode(), 'sha256')
return h.hexdigest()
令牌桶限流算法
class TokenBucket:
def __init__(self, capacity, fill_rate):
self.capacity = capacity # 桶容量
self.tokens = capacity
self.last_fill = time.time()
self.fill_rate = fill_rate # 令牌 / 秒
def consume(self):
now = time.time()
elapsed = now - self.last_fill
self.tokens = min(self.capacity, self.tokens + elapsed * self.fill_rate)
self.last_fill = now
if self.tokens >= 1:
self.tokens -= 1
return True
return False
错误重试逻辑
def exponential_backoff(retry_count):
# 指数退避算法
wait_time = min(2 ** retry_count, 30) # 上限 30 秒
time.sleep(wait_time + random.uniform(0, 1)) # 加随机抖动
性能优化
通过 JMeter 压测得数据对比:
| 场景 | QPS | 平均延迟 | 错误率 |
|---|---|---|---|
| 直连 API | 15 | 1200ms | 23% |
| 基础代理 | 45 | 800ms | 8% |
| 优化后代理 | 62 | 650ms | 1.2% |
关键优化点:
- 连接池大小 = (平均响应时间 /1000) * QPS * 2
- 启用 HTTP/ 2 多路复用
- 批量请求合并
避坑指南
- DNS 缓存问题:
-
解决方案:设置合理的 TTL 或强制刷新 DNS
-
TCP 连接复用:
-
解决方案:配置 Keep-Alive 超时大于 60 秒
-
API 密钥轮换:
- 解决方案:实现密钥热更新机制
扩展思考
未来可结合 CDN 边缘计算:
- 将静态内容缓存到边缘节点
- 动态请求通过 Anycast 路由到最优入口
- 利用 WebAssembly 处理简单逻辑
总结
这套代理架构在实际业务中稳定运行 6 个月,日均处理请求量超过 200 万。关键收获是:
- 熔断阈值建议设置在错误率 5% 时触发
- 监控指标需包含 TPM 使用率
- 日志要记录完整的请求 / 响应流水号
最终的架构既解决了 API 限制问题,也为后续扩展留足了空间。
正文完
