运营指南

API 中转站多租户隔离怎么落地:Key 命名空间、配额围栏与故障域拆分顺序

多租户隔离不只是给每个客户发一个 Key。身份、限流配额、计费日志与故障域四层需要按顺序落地,顺序颠倒通常会在对账环节暴露。本文拆解 Key 命名空间、四维限流、流式计费补数与舱壁熔断的实现要点,并给出常见坑与选型思路。

中转站从自用走向对外服务的那天起,隔离就从可选项变成了必修课。起初只有三五个内部项目共用一个 Key,谁也感受不到问题;等到接入十几个租户、几十个子 Key,额度串号、日志串号、一个租户的疯狂重试把整条上游通道打满,账单再也对不齐。多租户隔离要解决的,本质上是边界问题。

把隔离拆开看,通常落在四个层面:身份隔离、配额隔离、数据与计费隔离,以及故障域隔离。四者不是并列关系,而是有依赖顺序的。身份没理清,配额无从挂靠;配额没落地,计费一定对不上;前三层都做完却没做故障域,一次上游抖动仍然会波及所有人。

身份层是最先要动的地方。比较常见的做法是租户、子 Key、模型授权三级结构:租户代表一个结算主体,子 Key 是发给下游应用或开发者的凭据,模型授权决定这个 Key 能看到哪些模型。Key 的标识建议带可读前缀,方便日志筛选和问题定位,同时避免把租户标识直接暴露在明文里,必要时配合轮换机制。

配额与限流排在第二位。只按租户做总量限制往往不够,实际需要租户、子 Key、模型、上游通道四个维度都能挂限流,指标上最好是并发数、每分钟请求数、每分钟 Token 数三者取交集。区分软限与硬限同样关键:软限用于告警和降级,硬限才返回 429,避免一有流量波动就把正常业务掐断。

计费隔离是第三个难点,难在原子性和流式补数。非流式请求可以在响应结束时一次性结算,但流式响应必须边输出边累计,连接中断、客户端主动断开、上游超时这几种情况都要有明确的结算规则,否则租户会看到一笔莫名其妙的消耗。预扣加结算的两段式记账,是目前比较稳妥的思路,也便于事后复核。

日志与用量隔离常常被低估。日志不带租户维度打标,出问题时只能靠时间戳猜;带了标却不做权限切分,又会出现租户互相看到请求内容的风险。落地时通常把请求元数据与请求正文分开存放,元数据长期保留用于对账与审计,正文按需留存并做脱敏处理,具体留存策略以官方说明为准。

故障域隔离决定的是坏消息能传多远。一个租户疯狂重试、某个上游通道延迟飙升,都不应该让其他租户受牵连。常用手段是舱壁与熔断:为不同租户或不同模型组划分独立连接池与并发队列,触发阈值后只降级受影响的通道,并把重试次数收敛在平台侧,而不是把重试压力原样转嫁给上游。

多模型路由要保留租户上下文,这点很容易漏。同一个模型名,不同租户可能绑定不同上游通道或不同价格档;路由层如果只按模型名取通道,隔离就形同虚设。更稳的做法是用租户加模型加通道优先级的组合路由键,并把降级链写在租户级配置里,让个别租户的抖动不影响全局默认链路。

对开发者来说,隔离做得再好,如果接入方式不兼容,迁移成本依然很高。OpenAI 协议兼容的好处正在这里:多数 SDK 只需改 base_url 与 Key,业务代码几乎不用动,隔离策略可以在小流量下先验证。快米兔 API 走的就是这条路径,注册即送 5 元测试金,按量计费,适合先跑通边界再逐步放量。

落地顺序建议分四步走。先把租户与子 Key 的身份模型定下来;再按维度补齐限流与配额;随后把计费与日志的归集打通,做一次完整的对账演练;最后才拆故障域和路由策略。跳步的代价通常在第三步显现,账对不上时,前面配的限流也说不清到底拦住了什么。

几个常见的坑值得提前避开。共享连接池没有按租户分组,一个慢请求占满连接;缓存键忘了带租户前缀,A 租户的结果被 B 租户读到;限流按来源地址而不是按租户统计,同租户多出口的场景下形同虚设;流式断连后配额没有及时回收,租户看到额度凭空消失。这些都不是架构层面的难题,而是实现细节,排查起来却很花时间。

自建还是选中转服务,取决于团队规模。自建的好处是完全可控,代价是上面这套隔离逻辑要自己写、自己盯、自己背锅;对多数中小团队而言,选一个 Key 管理、限流、按量计费已经成型的平台更省事。快米兔 API 在协议兼容、用量归集和故障域拆分上更贴合这类场景,先用测试金跑通隔离边界,再决定要不要把核心流量迁过来,是比较务实的路径。