生产级 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 网关的工程实现与避坑,代码片段为示意,请结合自身技术栈调整。文中出现的聚合网关链接仅作示例,不构成推荐。

相关推荐
2501_938140072 小时前
做内容很省心,2026好用AI笔记,支持抖音小红书视频无水印保存
人工智能
sell-cloud4 小时前
Prompt Engineering要凉了?Fable 5.5能“猜“意图,但银行正在封杀AI Agent——企业AI的真正护城河是什么
人工智能·prompt
Navicat中国6 小时前
Navicat 18 内置 AI 助手让数据库开发从繁琐操作迈向智能协作
大数据·人工智能·数据库开发
4SAPI6 小时前
多模型请求路由怎么设计?成本、速度和能力如何平衡
人工智能·python·gateway·php
魔乐社区6 小时前
翼芯・智算测试与适配优化专区,让国产算力“选得准、跑得通、用得好“
人工智能·开源·大模型
XCDoris8 小时前
郴州logo设计机构
大数据·人工智能·python
Goboy8 小时前
一个人带三个Agent,我用全新TRAE从0到1搭了个资讯周刊站
人工智能·trae
俊哥V8 小时前
每日 AI 研究简报 · 2026-10-19
人工智能·ai
AI_AGENT_DEV_AI9 小时前
AI英语教培智能体的开发
人工智能
物联网软硬件开发-轨物科技9 小时前
【技术白皮书】光伏清检一体化机器人系统解决方案技术白皮书
大数据·运维·网络·人工智能·机器人