近期完成一个积分(钱)系统的搭建,可用于兑换实体奖品,具备价值符号。其中遇到的问题和积累的方案进行小小的总结和思考。

功能设计
-
绑定与账户
1、标识同一个用户,在积分系统外部并没有暴露账户id,而是由其他能标识用户身份的信息W组合而成,如手机号、微信号、邮箱。通过将多个外部信息W映射(绑定)到唯一的内部账号id,就认同为是同一个账号。同时支持同类外部信息绑定,如多个手机号绑定同一账号id(但同一个手机只能属于一个账号id)。通过绑定关系,积分系统内部屏蔽掉外部信息的复杂性,而且外部无感知账户id,也是一种保护措施。账户信息存储账户最基本的属性,如可用余额、发放总额、过期总额、余额更新时间等。
2、账号的唯一确认需要通过积分产品id+外部信息W来唯一确定,
也就意味着不同的积分产品id会有不同的账号,比如通用积分产品、临时活动专用积分产品来隔离不同积分账户。 -
积分发放
1、如果系统不提供账号绑定和创建功能,发放时候还要负责账号的创建和绑定。即不存在时候创建账号,要注意下这里同一用户同一时刻多笔(不同业务流水)发放可能创建多个账户的问题,通过唯一键+事务失败回滚+重试保证发放成功。
2、发放、消费、退还等交易类请求,同一前提都是先在事务外入库流水表,这样在事务失败时候也能保证有记录,即失败也会更新流水表,尽可能记录住失败的原因用于排查。流水还能实现交易类幂等性,将流水id(外部出传入)作为唯一键存储。
3、发放都要唯一指定批次id,每一笔发放都是属于某个批次的,当批次无效或者批次奖金池达到上限时候禁止发放,也可以在批次上设定每日每人限额。一般一个批次对应一个活动,而每个活动的奖金和限制都不尽相同。
4、任何交易类都在账户表上加锁,避免多个业务场景下并发问题,如同时发放和同时消费、同时过期冲突。账号锁是每一次
积分系统设计与实践

最低0.47元/天 解锁文章
3516

被折叠的 条评论
为什么被折叠?



