SWE · System Design / 设计追问

Agent按token计费限流:预留额度与实际消耗对账

并发生成前预留预算,结束后结算,不能只数请求。

题目重点:并发生成前预留预算,结束后结算,不能只数请求。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练合同有tenant预算与短期限速两层;输入token可估算,输出长度上界需配置。
  • 采用硬预算不允许透支;并发/重试/流式中断的计费真值需以模型服务账单口径确认。

解题路线

  1. 请求携带idempotencyKey,预算账本按租户原子reserve预计最大成本,成功才发生成;不足拒绝或降低输出上限。token bucket只控制速率,不自动守住日/月总预算。
  2. 生成结束commit(actual),释放多余预留;失败/中断按实际已用token结算。请求ID与reservation状态机让重试不会重复预留/重复退款。
  3. 长任务预留过多损害利用率,可分段追加额度,但每追加前必须原子扣减,且不能承诺已生成后再检查硬预算。超时租约回收须确认任务真正终止或以fencing拒绝旧任务继续消费。

手动走一遍

余额1000,两请求各预留600;原子处理让首个通过、第二个拒绝,不出现两次读余额均足够的超支。首个实际400,释放200,余额600。生成网络断开但后端仍运行,客户端不能立刻release全部600,否则后台消费与新请求一起突破预算。

规模与取舍

每请求若干原子账本操作,热点tenant会受单key串行吞吐限制;可授权分片额度但严格总预算需要额度守恒与回收。监控预留悬挂、账单差与拒绝率。

易错点与追问

容易失分的边界

  • 估计平均输出并事后补扣不能保证硬额度。
  • 退款幂等和扣费幂等同样必要,否则重试可凭空增加余额。

继续深挖

  • 模型最终usage迟到,如何让账目可恢复并保持保守上界?
  • 多区域服务如何分配子预算,区域断网时是否仍允许消费?
✓已复制微信号!