生产级 AI 网关落地:鉴权、限流与故障转移的 7 个坑

关键词:网关 / 生产实战 / 避坑 适用读者:已经决定在业务和模型之间加一层网关,正在写第一版实现的工程师

很多团队在本地把网关跑通、调通了 GPT-5 和 Claude 4 Sonnet 就以为万事大吉,结果一上生产就被各种诡异问题暴击:Key 泄露、请求雪崩、流式中断、额度一夜烧光......

下面这 7 个坑,是我从多次生产事故里攒出来的。每一条都配一段能直接抄的代码片段,照着改能省掉至少一晚的 oncall。

注:下文示例默认你的网关对外暴露OpenAI 兼容协议,这样业务侧几乎不用改代码就能在 GPT-5、Claude 4 Sonnet、Gemini 3 Flash、DeepSeek V4 之间自由切换。

坑 1:密钥硬编码在代码里

最典型的低级事故。Key 写进源码推到仓库,转头就被扫库机器人拖走,额度半小时清空。

正确做法:Key 走环境变量或密钥管理服务,网关内部再做一层"对外统一 Key、对内多厂商 Key 池"的映射。

python

复制代码
# ❌ 错误:密钥写死
# OPENAI_KEY = "sk-xxxxx"

# ✅ 正确:网关侧统一入口 Key,背后映射多家厂商 Key 池
# 国内聚合网关示例(统一 OpenAI 兼容协议,新用户有免费额度额度包)
# 注册:https://www.moyu.info/register?aff=CRB8
GATEWAY_BASE = "https://gateway.example.com/v1"
GATEWAY_TOKEN = os.environ["GATEWAY_TOKEN"]   # 业务侧只持有一个网关 Key

坑 2:没有全局超时

某家模型一旦卡住(限流排队、内部故障),你的请求会一直挂着,连接池被占满,连锁拖垮整服务。

python

复制代码
import httpx

# 连/读都要有上限,且读超时别太长
client = httpx.AsyncClient(
    timeout=httpx.Timeout(connect=3.0, read=30.0, write=10.0, pool=5.0)
)

坑 3:限流只在客户端做

客户端说自己限流了,不代表真限住了------多个实例、多个业务线各自限流,汇总到网关侧早就超了。

python

复制代码
# 限流必须落在网关层,且按 (业务线, 模型) 维度
from slowapi import Limiter
limiter = Limiter(key_func=lambda r: f"{r.headers.get('X-Tenant')}:{r.json().get('model')}")

@limiter.limit("20/minute")
async def proxy(request): ...

坑 4:单点故障没有 fallback

主模型(比如 GPT-5)限流或抖动时,如果没有兜底,用户直接看到报错。

python

复制代码
FALLBACK_CHAIN = {
    "gpt-5":        ["claude-4-sonnet", "deepseek-v4"],
    "claude-4-sonnet": ["gpt-5-mini", "gemini-3-flash"],
}

async def call_with_fallback(model, payload):
    chain = [model, *FALLBACK_CHAIN.get(model, [])]
    for m in chain:
        try:
            return await do_request(m, payload, timeout=8.0)
        except (RateLimit, TimeoutError):
            continue   # 下一个兜底模型
    raise AllModelUnavailable()

坑 5:没有请求追踪

出问题查不到"这个请求走了哪家模型、花了多少 token、卡在哪一步"。

python

复制代码
# 每个请求带 trace_id,贯穿网关与厂商调用
import uuid, logging
trace_id = request.headers.get("X-Trace-Id", str(uuid.uuid4()))
logging.info({"trace_id": trace_id, "model": model, "action": "upstream_call"})

坑 6:流式响应没处理中断

前端断了、用户关了页面,网关还在傻傻往厂商拉流,连接和额度双浪费。

python

复制代码
async def stream(model, payload):
    async with client.stream("POST", f"{GATEWAY_BASE}/chat/completions",
                             json=payload, headers=auth) as resp:
        async for chunk in resp.aiter_lines():
            if await request.is_disconnected():   # 客户端已断开
                break                               # 立即中止向上游拉流
            yield chunk

坑 7:额度没做隔离

一个测试脚本把你整月的额度刷爆,生产业务直接无模型可用。

python

复制代码
# 按 tenant 做额度配额,超额直接拒绝而非扣爆共享池
QUOTA = {"prod": 1_000_000, "test": 50_000, "eval": 200_000}  # 单位:token/天

def check_quota(tenant: str, estimate: int):
    used = redis.incrby(f"quota:{tenant}:today", estimate)
    if used > QUOTA.get(tenant, 0):
        raise QuotaExceeded(tenant)

落地清单(照着勾)

  • 密钥不进代码库,网关统一入口 Key + 厂商 Key 池
  • 全局 connect/read 超时都设了
  • 限流在网关层,且按 (tenant, model) 维度
  • 主模型失败有兜底链 + 超时
  • 每个请求有 trace_id 贯穿全链路
  • 流式响应监听客户端断开
  • 按业务线做额度隔离

把这 7 条在第一次提交时就写进去,后面至少能少背三次锅。


本文聚焦生产环境 AI 网关的工程实现与避坑,代码片段为示意,请结合自身技术栈调整。文中出现的聚合网关链接仅作示例,不构成推荐。

相关推荐
库拉大叔1 小时前
一站式AI模型聚合平台实测:GPT/Claude/Gemini全系调用,国内直连无需翻墙
人工智能·gpt
happyprince1 小时前
03_NVIDIA_ModelOpt-量化算法深入
人工智能·深度学习·算法
孤月葬花魂1 小时前
Token 正在吞掉程序员的钱包:一个月 AI 成本上万元,新时代的“生产资料”已经变了
人工智能
exarunner1 小时前
KV Cache 驱逐要不要上 Radix Tree?以 Mooncake模拟一下
人工智能
阿牛哥_GX1 小时前
Angular 页面自动化进阶:Select2 组件与表单提交
人工智能
橘子星1 小时前
🤖 从零造一个AI程序员:30行核心代码拆解Cursor背后的Agent原理
人工智能
大鱼>1 小时前
AI+货物追踪:智能快递柜追踪系统
人工智能·深度学习·算法·机器学习
程序喵大人1 小时前
【AI专栏】图解Transformer - 第04章:LLM生成
人工智能·深度学习·llm·transformer
1234567890@world1 小时前
知识管理 | 数字化 | APQC
大数据·数据库·人工智能