朋友问我如何设计一个短信发送的计费逻辑,要避免并发,系统异常重启,短信平台故障等现实存在的各种情况下的计费错误问题,经验不足,求帮助,这是初步想法:
数据表:
- 有个短信数的表,记录剩余数量等,更新操作的时候用乐观锁
- 有个短信发送记录表,里面除了发送记录,还要有个是否发送状态和计费的状态
逻辑: 以下每个逻辑都请使用事务操作
-
当发送短信后,增加一条发送记录
-
当短信成功后,编辑发送记录,状态标记为发送成功,然后(更新短信数的表,成功后更新计费状态,如果失败, 尝试三次,如果还是失败就放弃,标记计费失败)
-
定时监测发送状态成功的,计费状态为失败的并且时间超过 30 分钟的短信记录,补一刀
但感觉还是有很多问题,比如,短信发送了,创建记录失败,回滚有毛用,短信已经发送了 另外想到 redis 的 INCR,是不是作为剩余数量就完美解决了该问题? 求各位支招