P331 · 工具调用

入队前一次性预留预算

Atomic Budget Admission Before Enqueue

接收高成本任务前,原子地预留允许使用的预算。

编辑审核

以下示例与示意结果由本站编写,用于说明方法,不是模型实测结果。

使用场景

生成服务只剩10个教学预算单位,两条同时到达的请求各估算6单位。若入口只查余额、worker才记账,两条请求都可能被接受。需要在共享预算边界处理并发承诺。

具体做法

在权威存储中将余额检查与预留合成原子操作。准入成功产生预留ID,任务携带该ID入队;失败不入队。为同一请求使用幂等身份,避免重试重复预留。设计预留成功但入队失败的补偿或事务性发件箱;完成后按实际用量对账,失败及过期也有明确释放规则。

反例

两条6单位请求各自读取余额10后入队,在worker启动时再扣费;这样入口检查就能控制预算。

改进写法

并发处理这两条请求时原子检查并预留。第一条预留6并以预留ID入队,第二条看到可用4而拒绝入队。记录请求身份和预留状态;入队失败按约定补偿,worker完成后对账实际用量,不能再次当作全新扣费。

为什么这样改

检查与预留分离会让并发请求依据同一旧余额作决定。原子准入将尚未完成的任务承诺计入预算;任务与预留身份绑定才能追踪补偿和重试。

如何验证

教学并发测试应只接受一条任务,预留6、可用4,队列无被拒请求。重复同一请求不产生第二次预留。模拟入队失败后应释放或进入可恢复待入队状态;模拟实际用量5,按契约返还1并关闭预留。

适用边界

估算不等于真实账单。严格支出上限还要限定执行用量、覆盖所有收费路径并可靠对账。预留过期不能在worker仍运行时任意释放;队列和预算分属不同系统时尤其要处理部分失败。这不是具体货币或供应商价格建议。

原文与版本

如何收录这些方法