给每个团队划了资源额度,月初一切正常,利用率报表也漂亮。到了大促,几个团队同时扩容,全部撞上"申请不到"——不是没额度,是额度对应的资源根本不够;也不是没人提前申请,是提前申请的那部分被别人平时的用量吃掉了。
这套机制本来要干两件事:限制每个团队能用多少(限额控制),以及保证峰值时一定拿得到(容量预留)。它们被实现成了同一个数字:一个额度。而额度天然只能表达一种含义——要么是上限,要么是下限,不能同时是两者。共用之后,被牺牲的一定是预留那一侧:上限会被执行,下限只存在于账面。
1. 两种用途的分配逻辑相反
| 维度 | 限额控制 | 容量预留 |
|---|---|---|
| 目标 | 总量约束 + 团队间公平 | 峰值时确定能拿到 |
| 这个数字是什么 | 上限:不得超过 | 下限:不得少于 |
| 判据 | 周期用量不超上限,拒绝可解释 | 峰值窗口内资源可用,无需临时申请 |
| 分配逻辑 | 按历史用量与权重切分,可动态调整 | 按峰值独占,不可被他人消费 |
| 时间尺度 | 计费周期(月 / 日) | 峰值时刻(分钟级) |
| 失效形态 | 超限被拒(硬,立刻可见) | 抢不到(软,表现为排队、超时、降级) |
| 需要的机制 | 计量 + 上限 + 拒绝 | 独占 + 隔离 + 抢占规则 |
| 归谁管 | 财务 / 平台 | 容量规划 / SRE |
一个数字被两种目的读取,含义就分叉了:
// 同一行额度记录
quota: team-a = 100 (cores)
// 限额读法:本周期最多用 100,超出即拒绝 → 这是上限
// 预留读法:峰值时刻必须能拿到 100 → 这是下限
// 上限与下限用同一个数字表达时,两者互相解释
// 结果:拒绝逻辑一定被执行(它有人工审批与告警),保障逻辑没人执行(它没有触发器)
2. 共用一个额度池的三个后果
| 后果 | 机理 | 症状 |
|---|---|---|
| 谁先用谁占 | 额度按周期累计,先到者占用,后到者被拒 | 月初宽松月末排队,与业务节奏完全无关 |
| 预留被挪用 | 预留只是账面数字,共享池允许"临时借用" | 峰值时预留不生效,所有团队一起超限 |
| 峰值集体超限 | 各团队按均值申请,峰值叠加超过物理容量 | "额度都够,但谁都跑不起来" |
第三条可以算出来:各团队峰值不同时,叠加需求的上界是各自峰值之和;而按均值申请,峰值时的需求大约是均值的 2–5 倍(倍数按自己的流量曲线核对,不要套用)。也就是说,按均值核出来的额度,在峰值时刻注定不够——而额度是按周期结算的,周期内它看起来一直够。
// 均值核对与峰值核对的差额(示意,倍数按自己的曲线核)
// 团队 A:均值 30 核,峰值 90 核
// 团队 B:均值 20 核,峰值 70 核
// 均值口径合计:50 核 → 物理池 60 核,看起来通过
// 峰值口径合计:160 核 → 物理池 60 核,缺口 100 核
// 大促当天:额度都"没超",资源全部抢不到
3. 被牺牲的是预留的确定性
共用一套额度之后,被牺牲的是容量预留的确定性——也就是"峰值时一定拿得到"这个承诺。它会静默失效,原因是三件事同时成立:
- 预留失效没有触发器。超额拒绝有拒绝码、有告警、有工单;而"预留没生效"没有事件,它只表现为峰值时排队变长,被归因为流量太大。
- 挪用预留会让指标变好。把预留拿出来共享,利用率立刻上升——利用率是额度体系里最常被考核的指标,于是机制在奖励挪用。等到峰值,被考核的指标依然是"利用率",不是"满足率"。
- 超卖以债务形式存在,不进账单。例:按 1.3 倍超卖,平时账单漂亮,峰值时约三成需求拿不到资源;这笔债不体现在成本报表里,只体现在峰值满足率里,而后者往往没有指标。
"额度用完"与"资源不足"是两件不同的事,混在一起就无法判断该扩容还是该排队:
| 现象 | 真实含义 | 该做什么 | 误判的代价 |
|---|---|---|---|
| 请求被拒,原因是额度 | 计量口径的上限到了 | 调额度、借调、或排队降级 | 误判为容量不足 → 盲目扩容,成本上升而拒绝率不变 |
| 请求抢不到资源 | 物理容量不够,或预留已失效 | 扩容 / 恢复独占 | 误判为额度问题 → 调额度,峰值仍然抢不到 |
| 两者同时发生 | 额度与容量都紧 | 先恢复独占,再按峰值核容量 | 只处理一个 → 下次重复同样的事故 |
预留必须有独占性,否则它只是账面数字。可验证的预留至少满足三条:
// 预留的三项检查:缺一条,它就不是预留
// 1) 独占:别人能不能借走?能借走 = 不是预留
// 2) 可验证:峰值时刻能否实测"我确实拿到了"?不能测 = 无法追责
// 3) 有代价:被借走时借用方付什么?没有代价 = 借用必然发生
reserved(team-a, peak) = 100
actual = min(quota, capacity_not_consumed_by_others) // 峰值时实测
if actual < reserved → 记一次挪用,并且这是可追责事件
配额与优先级的关系是"有优先级才有借调规则":
| 借调机制 | 规则 | 失效方式 |
|---|---|---|
| 共享池 + 优先级抢占 | 高优先级可抢低优先级 | 低优先级没有 SLO,被反复抢占后彻底不可用 |
| 预留 + 借用登记 | 借用需登记并限期归还 | 归还不落实,等于永久挪用 |
| 硬隔离(独立资源池) | 物理隔离,不可能被借 | 成本高、利用率低,需要接受浪费 |
突发流量的处理是这套机制最容易退化的地方:一旦"临时可借",预留当天就会被借空。三条规则缺一条,突发额度就变成人人可抢:
// 突发额度的三条约束
// 1) 突发只能来自共享池,永远不许动预留(一旦允许,预留就失去意义)
// 2) 抢占必须带优先级与回收时限(到期自动归还,不依赖人记着)
// 3) 被抢占方必须收到明确信号(降级 / 排队),否则它不知道自己已被降级
// 反例:只写"可临时借用",等于把预留变成了公共池,且没有任何归还记录
超卖比例是这套机制里唯一真正的债务,需要单独记账:
// 超卖的债算得出来,只是不以成本形式出现
// 承诺量 = 物理容量 × (1 + 超卖比例)
// 峰值缺口 = 承诺量 - 物理容量 = 物理容量 × 超卖比例
// 这笔债的偿付方式是"峰值时 x% 的请求排队或降级"
// 允许超卖的前提:峰值不同步 + 存在降级通道;两者缺一,超卖就是欠债
还有一处结构性错位值得单独指出:付钱的是成本中心,占额的是团队。团队多占不付钱,成本中心压缩不用资源,于是"额度调整谈判"取代了容量规划——每次大促前谈一轮数字,谈完谁都不负责峰值时刻的真实可用性。
额度调整周期与业务节奏的错配也是同一类问题:额度按月结算,业务按周变化,大促需要提前数周申请。于是额度窗口变成了发布窗口的瓶颈,紧急扩容走"特批",而特批不留记录、不进下一轮基线。
四个口径能把"确定性是否被牺牲"变成可观测事实:
quota_utilization // 已用 / 额度;按周期看趋势,不看单点
reject_ratio_at_peak // 峰值窗口内因额度被拒的比例
reservation_preemption_count // 预留被挪用/借走的次数,应为 0 或极少
peak_satisfaction_ratio // 峰值窗口内成功获得资源的请求占比 ← 关键
// 判据:利用率高 + 峰值满足率低 = 预留已被挪用,且指标在奖励这件事
4. 排错
| 现象 | 可能原因 | 验证方式 | 处置方向 |
|---|---|---|---|
| 大促时"额度都够但都跑不起来" | 预留没有独占性 | 峰值实测各团队实际可获资源 | 恢复独占或改硬隔离 |
| 月度前松后紧 | 额度按周期累计,先到先得 | 看用量曲线形状与拒绝时间分布 | 改成峰值口径 + 借调规则 |
| 调了额度仍然被拒 | 混淆额度与容量 | 对比拒绝原因码(额度 vs 容量) | 分开定位,分别扩容或排队 |
| 利用率很高但峰值满足率很低 | 挪用预留抬高了利用率 | 两个指标对着看 | 利用率不再作为唯一考核项 |
| 预留申请越批越多 | 没有到期与回收 | 统计预留总量与实际峰值 | 预留带到期日与季度复核 |
| 成本归属与额度归属不一致 | 付钱方与占额方不是同一责任人 | 对比成本中心与额度归属清单 | 归到同一责任人 |
5. 边界
| 场景 | 结论 | 理由 |
|---|---|---|
| 资源由单一团队独占 | 不需要额度体系 | 没有分配冲突,计量成本大于收益 |
| 成本可忽略(内部小集群) | 正式额度是负担 | 管理成本高于浪费的绝对值 |
| 业务无峰值(负载平稳) | 均值口径即可 | 峰值 ≈ 均值,预留没有意义 |
| 资源弹性极强(分钟级扩容) | 用软配额 + 告警 | 容量不是稀缺品,确定性可以用速度换 |
| 团队数少于 3 | 口头协调更快 | 审批链与计量体系的固定成本过高 |
| 核心链路有强 SLO | 必须硬预留 | SLO 的确定性不能靠额度表达 |
// 最小可用体系:两本账,永远不要合并
// 账 A(限额):周期用量、上限、拒绝策略、超限告警 → 结算单位是钱
// 账 B(预留):峰值独占量、借出与归还记录、到期时间 → 结算单位是可用性
// 合并成一本账的那天,上限与下限开始互相解释,最后只剩一个能被执行的
6. 自测
- 为什么"额度"这个数字无法同时表达上限与下限?合并之后哪一侧会被执行?
- 按均值核额度,在峰值时刻会出现什么?缺口与哪些因素成正比?
- 预留要成为预留,必须同时满足哪三个条件?缺一个会怎样?
- 为什么"利用率"这个指标会奖励挪用预留?它应该和哪个指标一起看?
- "额度用完"与"资源不足"各自的处置动作是什么?误判的代价分别是什么?
- 什么情况下正式额度体系反而比不设额度更贵?