一次资金操作,由调用方给出身份
以一位团队成员发起音乐生成为例:调用方申请预占积分,Billing
创建资金记录并返回操作编号,生成结束后按该编号完成扣费。
调用方提供金额、幂等键、用户与业务信息Billing预占、完成、幂等和持久化账户余额、冻结、消费/充值记录
-
开始前:用幂等键申请预占积分
调用方传入幂等键和预占金额。prepareOperation
检查可用积分,创建资金记录、冻结积分并返回操作编号。重试时复用原幂等键,返回原记录;若预占金额变了,则报冲突。消费用户、可选摘要和追踪信息以首次请求为准。
-
结束后:按操作编号完成扣费
调用方传回操作编号、实际扣费金额和可选的用量记录。completeOperation
从余额扣除实际金额,取消本次全部冻结,并原样保存用量记录。金额由调用方决定,Billing
不从用量记录计算费用。
-
Billing 只收尾一次
相同操作编号、相同实际扣费金额,重复请求只返回第一次的结果,不再次扣款,也不覆盖用量记录;金额不同则报冲突。另一笔资金操作使用新的幂等键。
实际扣费不依赖用量记录的内容
即使用量记录没有 token、数量、模型或价格,也能按传入的实际金额完成扣费。实际扣费为 0
时,只取消本次冻结,不减少余额。任务是否成功由调用方判断。
- 幂等键 · 防止重复预占
-
幂等键(idempotencyKey)由调用方生成,Billing
原样保存。同一租户内,相同幂等键表示重试同一次预占。成功后返回操作编号(operationId),后续完成扣费使用该编号。Billing
不做哈希或业务推导。
- 业务域与追踪编号
-
domain 是业务域字符串,primaryId、secondaryId
是可空字符串。含义全部由调用方确定,仅用于查询关联,不参与幂等,不加唯一约束。
- 摘要(summary)· 选填
-
调用方可在预占时提供字符串,例如“音乐生成”。未提供存
NULL,不自动生成;原文用于列表与详情;重复调用不覆盖,完成时不再传入。
- 用量记录(usage)· 选填
- 调用方给定任意合法 JSON 值。Billing 原样存取,不校验业务 schema,不提取字段计算金额。
会议核对后删掉了哪些额外职责?
删除 estimatedUsage → 价格映射 → 计算金额的流程;金额改为调用方直接传入。删除 usage
的业务字段要求和价格内容禁令;保留一列 JSONB 原样存取。资金表示改为 64 位整数。
worker 的 REST
化、Conductor、轮询、状态保存、重试、停止和用户提示均由调用方接入。当前仅更新设计,尚未实现 Billing。