多租户配额是什么
按用户、租户或应用把用量切分开,给每一份设置上限与告警:软阈值提示、硬阈值拦截。它的价值不只是控成本,也在防事故——一个写错的循环调用或被盗用的密钥,能在几小时内烧掉整月预算,而只看总量账单根本定位不到是谁在烧。落地时最容易做错的三处是计量维度是否覆盖多模态、周期重置是否与计费一致、预扣额度失败后是否归还。
基本信息
| 计量维度 | 按用户、租户、应用或 API 密钥切分,可组合使用 |
|---|---|
| 计量项 | 输入输出 token、请求次数、图像张数、语音分钟,多模态需分开计 |
| 重置周期 | 日或月滚动窗口,用带过期时间的计数器实现 |
| 双阈值 | 软阈值约 80% 触发告警,硬阈值 100% 拦截并返回明确提示 |
| 例外通道 | 白名单与临时提额走审批,并留下操作记录 |
| 额度归还 | 调用失败或中途取消时,预扣的额度必须退回,否则重试会重复扣减 |
典型使用场景
- SaaS 套餐额度:基础版与专业版给不同的 token 上限,按套餐校验
- 多个团队共用一套模型账号:按团队分摊用量,月底能出成本明细
- 防密钥滥用:单个密钥在异常时段高频调用,配额能自动限速止损
- 大客户临时提额:走审批流程提额,到期自动回落而非永久放开
- 成本归因与对账:把供应商账单与租户用量对齐,定位漏账与跑冒滴漏
预扣、校验与归还
预扣、校验与归还
def reserve(tenant, est_tokens):
key = f"quota:{tenant}:{today()}" # 按租户与当天生成计数键
used = redis.incrby(key, est_tokens) # 调用前先预扣,避免并发超额
redis.expire(key, 86400 * 2) # 计数器过两天自动清理,防止键堆积
limit = plans[tenant.plan].daily_tokens
if used > limit: # 硬阈值:直接拦截,不要等模型返回
redis.decrby(key, est_tokens) # 拦截时必须把预扣的量退回去
raise QuotaExceeded(tenant, used, limit)
if used > 0.8 * limit:
alert(f"租户 {tenant} 用量已达 80%") # 软阈值提醒,人工介入更早
def release(tenant, est_tokens, actual_tokens):
redis.incrby(f"quota:{tenant}:{today()}", est_tokens - actual_tokens) # 按实际用量校正维度与计量注意点
| 维度 | 计量单位 | 注意点 |
|---|---|---|
| 文本对话 | 输入与输出 token 分开 | 输出单价通常更高,单列一列 |
| 图像生成 | 按张数与尺寸档位 | 重生成要计入额度,否则成预算黑洞 |
| 语音转写 | 按音频分钟 | 与文本 token 不可混算 |
| 向量与重排 | 按存储量或处理对数 | 独立配额,避免检索侧挤占生成预算 |
| 请求次数 | 按调用次数 | 防止高并发短请求绕过 token 限制 |
配额拦截必须发生在调用模型之前:先扣后调,失败归还。如果先调后扣,并发场景下多个请求会同时通过校验,超限照样发生。
只有总量告警没有租户维度,等于没有配额:账单超标时无法定位是哪个租户或哪把密钥造成的,只能被动补款。