抽奖高并发实现流程逻辑
首先我们会采用 Laravel (服务端处理程序) + Redis(高速缓存) + Mysql\MongoDB(持久存储) 的形式
本文章只会展示实现逻辑以及流程图,并不会直接展示代码,里面涉及到一些知识如果有不明白欢迎提问
业务说明
我们需要一个能够承受高并发的抽奖程序,并且能够限制用户参与数量的抽奖程序
队列说明
首先我们会将一些比较耗时的工作加入到队列中进行处理,那么我们会分为几个队列
- 参加队列 - (主要处理用户参加抽奖的处理逻辑)
- 开奖队列 - (主要处理活动开奖的逻辑)
- 结算队列 - (主要处理发放奖品 统计数据)
提供接口说明
- 发布抽奖 - (设定 参与人数限制、抽奖时间和开奖时间)
- 参与抽奖 - (需要返回用户是否参与成功)
- 是否中奖 - (判断该活动是否中奖)
发布抽奖-流程
在这里将活动写到缓存中的好处就是不用去读取数据库的信息,导致数据库压力过大
参与抽奖-流程
在这里直接判断缓存中的参与人数字段,并且通过Redis锁的方式处理库存,当库存为0的时候就不允许继续参与了
这里通过获取缓存的方式将活动时间范围也缓存起来,获取判断
这里直接通过加入队列的方式,将写用户参与活动记录的操作放到了 另一台处理器进行运行。
处理队列会在后台处理用户加入操作并且将参与记录记录到数据库 和 缓存中
结算抽奖-流程
这里将开奖的活动通过处理器 将活动在后台进行默默地结算 并将结果数据输出到缓存和数据库
对于缓存的Key 我们可以这样子设计 (版本_类型_开始时间YmdHis_活动ID)(版本_类型_结束时间YmdHis_活动ID)(版本_类型_活动ID)
或者如果抽奖任务太多则可以通过定时任务,获取需要结算的任务并且加入到结算队列中去,并且保存一个结算版本
是否中奖-流程
这里直接读取缓存中的中奖信息结果并返回