谷粒商城项目介绍
基本信息
- 项目结构与使用组件
- 系统管理
- 商品系统
- 优惠营销
- 库存系统
- 订单系统
- 用户系统
- 注册
- 登陆
- 商品检索
- 购物车
- 订单系统
- 秒杀功能
文章正文:
本篇为项目大纲,详细涉及的知识点可以查看
??回到顶部项目视频地址。??回到顶部??回到顶部实现数据最终一致性。
具体实现就是在订单模块的主事务方法中进行订单、订单项数据的添加,并调用远程接口进行锁库存操作。然后根据这次远程调用的结果选择订单的状态,最后发送一个释放库存、修改订单状态的消息给延时队列,并且调用远程的锁库存操作也会发送一个释放库存的消息给延时队列,这样可以解决两个问题。1)一段时间内用户未支付订单库存会自动解锁;2)如果调用的远程锁库操作正常执行,但是本地事务方法发生了异常,那么远程未回滚库存也会在一段时间后也会自动解锁。
2、使用 Redis 存储订单令牌,以此实现支付订单接口的幂等性。
通过 lua脚本来验证和删除令牌(在进入结算页面时会在 redis 存入一个数据作为令牌,随后生成订单时则会通过脚本来检查这个数据是否存在,如果存在就将其删除并返回1,否则返回0,因为需要查询和删除的通过是原子性所以使用脚本来实现),成功后执行业务代码。
3、使用支付宝沙箱环境模拟支付过程。账号:dubfpq8758@sandbox.com。密码和支付密码都是111111。在支付成功后修改订单状态并保存支付流水记录。
4、为了防止在支付界面一直等待直到后台队列将订单取消再完成支付,导致数据错乱,在消息取消订单时同时会关闭支付界面
5、为了防止由于消息积压、网络波动等原因导致解库存的消息先于取消订单的消息被接收执行,导致解库存失败(解库存会先判断订单状态是否是取消状态再进行解库存)所以在取消订单中也会发送一条解库存的消息。并且为了保证解库存的幂等性,在库存表中添加了库存工作单记录用于标记当前订单商品的的库存是否已经解锁了。
秒杀功能
使用定时任务+异步任务来实现秒杀功能。在每天的三点整会触发定时异步任务,将接下来三天内的所有秒杀场次以及秒杀商品的相关信息添加到 Redis 中(防止高并发的请求访问数据库),秒杀方法使用 Sentinel 进行限流控制,秒杀商品会在首页展示,并且在商品详情页中提示。
秒杀商品的下单与普通不同,其会直接跳过加入购物车步骤,直接创建好订单,随后可以直接支付。
秒杀的流程是:
1、校验秒杀验证码(在将秒杀商品展出时会创建一个秒杀随机码保存到商品属性中,并且展示隐藏在秒杀页面里,在秒杀时会取出商品信息进行比较)。
2、校验秒杀时间是否一致。
3、校验单次购买数量是否超过限制。
4、尝试向redis保存 "userID+场次ID+skuId" 为key的数据,如果成功说明是第一次,否则说明当前是重复操作,失败。
5、通过秒杀库存前缀+秒杀商品的秒杀随机码作为key来进行信号量的扣减来模拟锁库操作,再发送消息给秒杀的消息队列,使其在后台对数据库进行锁库操作。
redis 数据结构