抽奖高并发实现流程逻辑

11 篇文章 0 订阅
1 篇文章 0 订阅

抽奖高并发实现流程逻辑

首先我们会采用 Laravel (服务端处理程序) + Redis(高速缓存) + Mysql\MongoDB(持久存储) 的形式
本文章只会展示实现逻辑以及流程图,并不会直接展示代码,里面涉及到一些知识如果有不明白欢迎提问

业务说明

我们需要一个能够承受高并发的抽奖程序,并且能够限制用户参与数量的抽奖程序

队列说明

首先我们会将一些比较耗时的工作加入到队列中进行处理,那么我们会分为几个队列

  1. 参加队列 - (主要处理用户参加抽奖的处理逻辑)
  2. 开奖队列 - (主要处理活动开奖的逻辑)
  3. 结算队列 - (主要处理发放奖品 统计数据)

提供接口说明

  1. 发布抽奖 - (设定 参与人数限制、抽奖时间和开奖时间)
  2. 参与抽奖 - (需要返回用户是否参与成功)
  3. 是否中奖 - (判断该活动是否中奖)
发布抽奖-流程

在这里将活动写到缓存中的好处就是不用去读取数据库的信息,导致数据库压力过大

前端 后端 数据库 缓存 添加抽奖活动 写抽奖数据(参与人数限制、抽奖时间和开奖时间) 写抽奖数据(参与人数限制、抽奖时间和开奖时间) 添加成功 前端 后端 数据库 缓存
参与抽奖-流程

在这里直接判断缓存中的参与人数字段,并且通过Redis锁的方式处理库存,当库存为0的时候就不允许继续参与了
这里通过获取缓存的方式将活动时间范围也缓存起来,获取判断
这里直接通过加入队列的方式,将写用户参与活动记录的操作放到了 另一台处理器进行运行。
处理队列会在后台处理用户加入操作并且将参与记录记录到数据库 和 缓存中

前端 后端 缓存 队列 处理任务 数据库 请求参与抽奖 当前抽奖是否存在 抽奖活动不存在 当前抽奖是否在时间范围内 抽奖活动还没开始 当前缓存库存是否充足 参与人数已满 锁字段,更改参与人数 加入用户到(参加队列) 添加成功 如果存在则将用户加入到参与记录 写参与记录到数据库 更新参与记录到缓存 前端 后端 缓存 队列 处理任务 数据库
结算抽奖-流程

这里将开奖的活动通过处理器 将活动在后台进行默默地结算 并将结果数据输出到缓存和数据库
对于缓存的Key 我们可以这样子设计 (版本_类型_开始时间YmdHis_活动ID)(版本_类型_结束时间YmdHis_活动ID)(版本_类型_活动ID)
或者如果抽奖任务太多则可以通过定时任务,获取需要结算的任务并且加入到结算队列中去,并且保存一个结算版本

处理任务 缓存 数据库 队列 获取要开奖的活动 处理抽奖逻辑得到中奖信息 写入中奖信息 写中奖记录 加入统计任务队列 处理任务 缓存 数据库 队列
是否中奖-流程

这里直接读取缓存中的中奖信息结果并返回

前端 后端 缓存 询问是否中奖 获取活动缓存中奖信息 判断是否中奖 返回是否中奖 前端 后端 缓存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值