ENGINEERING NOTE 34 / 50 · CARD

并发请求下如何执行支出预算

OPEN RAMBO ·

先读余额再写的预算检查,可能让多个请求同时使用相同剩余额度。提交工作前应原子预留。

本文由 OPEN RAMBO 发布。工程方案和伪代码用于说明设计,不是现有产品 API 文档;示例数字均为演示。

预留而非只观察

两请求都看到剩余100,各批准80。应在事务或条件更新里组合资格检查与预留。预留与已结算支出分开记录。

确认失败后释放

权威拒绝后可释放预留,客户端断线不能作为充分理由。上游结果未知继续待处理。释放也必须幂等,重试不能多次增加可用预算。

对齐重置边界

日月预算需明确时区及未完成预留结转规则。重置不能抹掉仍可能结算的操作。每次预留、消耗、释放均保留账本证据。

示意流程

atomic_reserve(where={"available": {"gte": amount}},
               decrement_available=amount, increment_reserved=amount)

如何验收

同时发出总额超预算的请求,批准预留总额不得超过可执行额度。

继续阅读