Skip to content

[Billing] 多实例下余额扣减、并发和请求幂等保护 #50

Description

@WilliamWang1721

目标

解决用户担心的“余额乱飘”问题:无论请求打到哪个 Worker,用户余额、并发、订阅额度都必须一致。

代码背景

backend/ent/schema/user.go 中用户余额为 users.balance,并发为 users.concurrency。多实例下不能让每个 Worker 各自维护余额,也不能依赖异步互传。

实现建议

先做审计和测试,再决定是否需要结构调整:

  1. 找出当前余额扣减、使用记录写入、订阅额度消耗、并发占用释放的代码路径。
  2. 确认关键扣费路径是否在 DB 事务中完成。
  3. 对请求结算增加或复用 request_id / idempotency key,避免同一请求被重复结算。
  4. 如果当前只有 users.balance 直接更新,评估是否需要新增轻量账本表,例如 user_balance_ledger
  5. 流式请求异常断开时,明确“预冻结 / 最终结算 / 失败回滚”的行为。

最小验收

  • 增加多 Worker 并发扣费测试:同一用户同时请求 A/B Worker,不允许超扣或重复扣。
  • 增加请求重试/重复 request_id 测试:同一结算不能重复入账。
  • 明确标准计费模式和订阅模式分别如何处理。
  • 如果不新增账本表,必须在文档中解释当前实现如何保证一致性。
  • 不改动价格逻辑,只处理一致性。

Metadata

Metadata

Assignees

No one assigned

    Projects

    Status
    Backlog

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions