目标
解决用户担心的“余额乱飘”问题:无论请求打到哪个 Worker,用户余额、并发、订阅额度都必须一致。
代码背景
backend/ent/schema/user.go 中用户余额为 users.balance,并发为 users.concurrency。多实例下不能让每个 Worker 各自维护余额,也不能依赖异步互传。
实现建议
先做审计和测试,再决定是否需要结构调整:
- 找出当前余额扣减、使用记录写入、订阅额度消耗、并发占用释放的代码路径。
- 确认关键扣费路径是否在 DB 事务中完成。
- 对请求结算增加或复用 request_id / idempotency key,避免同一请求被重复结算。
- 如果当前只有
users.balance 直接更新,评估是否需要新增轻量账本表,例如 user_balance_ledger。
- 流式请求异常断开时,明确“预冻结 / 最终结算 / 失败回滚”的行为。
最小验收
- 增加多 Worker 并发扣费测试:同一用户同时请求 A/B Worker,不允许超扣或重复扣。
- 增加请求重试/重复 request_id 测试:同一结算不能重复入账。
- 明确标准计费模式和订阅模式分别如何处理。
- 如果不新增账本表,必须在文档中解释当前实现如何保证一致性。
- 不改动价格逻辑,只处理一致性。
目标
解决用户担心的“余额乱飘”问题:无论请求打到哪个 Worker,用户余额、并发、订阅额度都必须一致。
代码背景
backend/ent/schema/user.go中用户余额为users.balance,并发为users.concurrency。多实例下不能让每个 Worker 各自维护余额,也不能依赖异步互传。实现建议
先做审计和测试,再决定是否需要结构调整:
users.balance直接更新,评估是否需要新增轻量账本表,例如user_balance_ledger。最小验收