事关破产, 求助如何写用户扣费逻辑

1次阅读

共计 976 个字符,预计需要花费 3 分钟才能阅读完成。

我在写个功能:

1. 调用第三方企业收费 API 转卖给个人, 用户充值获得积分之后才能使用 API, 自己先垫付钱.

2. 第三方 API 调用失败不扣费.

3. 我搞了多个队列来限流用户的请求, 大概 20 多个.

4. 数据库用的 MongoDB

这是精简版数据模型

 数据表

id
userId // 用户 id
status // pending progress success fail
requestData // 用户的数据
resultData // 调用第三方 api 的结果

积分表

point 

先保存用户的 requestData 请求数据, status 默认为 pending, 然后把这条数据给到 queue 队列, 队列里来处理逻辑.

下面是我的逻辑:

// 在开始事务
startTransaction();

try{

// 1. 拿着 userId 查积分表 不足就 throw
if(point < 0) throw error NotEnoughPointError

// 2. 如果处理成功过, 又因为某些原因又加入到 queue 里了
if(status == success) throw error AlreadyInQueueError

// 3. 状态改为 progress
await setProgress()

// 4. 转换一下用户格式 不修改表里的数据
await transformRequestData()

// 5. 调用第三方 API 失败会抛出 ThirdAPIRrror
const result = await thirdAPI()

// 6. 扣用户的积分
await minusUserPoint()

// 7. 状态改为 success
await setSuccess()

// 8. 提交事务
commitTransaction()

// 9. 从队列里返回数据
return result

}catch(error){

// 1. 终止事务
abortTransaction()

// 2. 设置成错误状态
await setFail()} finally {

// 1. 结束事务
endSession();}

问题来了...

1. 我 20 多个队列同时大量这种请求, 队列是 Redis, 我加上这个事务是不是能解决并发扣费问题, 会不会多个操作同时扣费.

2. 如果从 try 里面的调用第三方 API 之后的 6. 扣用户的积分 7. 状态改为 success 8. 提交事务 这三个操作内部 throw 出错了, 我钱就白花了.

3. 我这逻辑有没有其他问题啊, 实在没写过扣费, 谢谢大家了.

正文完
 0