这是 Beta 探索课程,内容结构、实验步骤和示例可能会继续调整。
账单统计
场景
付费套餐上线后,第一批用户开始付费。
但财务部门找到我:
Finance Chat
周一 09:30
财
需求:
- 每月自动生成账单
- 统计每个用户的调用量
- 计算超额部分
- 发送账单给用户
问题分析
我查了一下当前的统计系统:
问题:
- 统计表每月聚合一次,不是实时的
- 没有按 API 分别统计
- 没有按时间段统计(用于计算超限)
- 没有计费相关的字段
账单系统设计
需求分析
账单需要包含:
1. 基本信息(用户、周期、套餐)
2. 使用情况(总调用量、各 API 调用量)
3. 费用明细(基础费用、超额费用)
4. 支付状态
计费规则:
- 基础费用:套餐月费
- 超额费用:超出套餐部分按次计费
- 超额价格:¥0.001/次(1 元 1000 次)数据库设计
账单生成逻辑
按用户生成月度账单
设计流程
按用户生成月度账单
- 步骤 1:生成账单并记录计费明细
- 步骤 2:计算用量、账单或套餐状态
- 步骤 3:读取用户套餐、调用量和当前计费周期
- 步骤 4:根据套餐、用量和支付状态选择计费处理路径
关注点:计费准确性、幂等处理、账单追溯和用户提示。
批量生成账单
月底定时任务
设计流程
月底定时任务
- 步骤 1:生成账单并记录计费明细
- 步骤 2:计算用量、账单或套餐状态
- 步骤 3:读取用户套餐、调用量和当前计费周期
- 步骤 4:根据套餐、用量和支付状态选择计费处理路径
关注点:计费准确性、幂等处理、账单追溯和用户提示。
账单查询 API
获取用户账单列表
设计流程
获取用户账单列表
- 步骤 1:生成账单并记录计费明细
- 步骤 2:计算用量、账单或套餐状态
- 步骤 3:校验身份、密钥或权限
关注点:计费准确性、幂等处理、账单追溯和用户提示。
获取单个账单详情
设计流程
获取单个账单详情
- 步骤 1:生成账单并记录计费明细
- 步骤 2:计算用量、账单或套餐状态
- 步骤 3:校验身份、密钥或权限
关注点:计费准确性、幂等处理、账单追溯和用户提示。
账单发送
自动发送账单
设计流程
自动发送账单
- 步骤 1:生成账单并记录计费明细
- 步骤 2:计算用量、账单或套餐状态
- 步骤 3:读取用户套餐、调用量和当前计费周期
- 步骤 4:根据套餐、用量和支付状态选择计费处理路径
关注点:计费准确性、幂等处理、账单追溯和用户提示。
练习
练习 1
月底定时任务因为网络问题重试了一次,同一个用户的账单可能被生成两遍。你会怎么避免重复扣费?
参考答案 (3 个标签)
计费 幂等 账单系统
账单系统最重要的是可追溯和幂等,不能只靠“任务应该只跑一次”。
可以这样设计:
- 账单唯一键:用
user_id + billing_period作为唯一约束,同一周期只能有一张正式账单。 - 生成过程可重试:重试时先查账单是否已存在,存在就直接返回,不再重复创建。
- 费用明细可追溯:账单金额来自明细表,明细也要有唯一标识,避免重复写入。
- 支付和账单分开:生成账单不等于扣款,扣款也要有独立的支付流水号和幂等键。
验证时可以故意让任务中途失败,再重复执行,检查账单数量、明细数量和支付流水是否都没有重复。