秒杀功能设计思路

前言秒杀业务需要关注的问题

在这里插入图片描述
02实现的方式只有场次开始才在页面放一个随机码,拿着随机码先校验才允许参加秒杀
在这里插入图片描述
07sentene

1.秒杀商品定时上架业务

是一个单独的微服务,若包含在其他服务中,在高并发访问环境下,秒杀业务会占用大量系统资源导致其他业务不可用。
创建场次,例4点场,6点场,场次关联商品(id,价格等),上架秒杀商品。
流程
在这里插入图片描述

2.秒杀上架

秒杀商品使用异步定时任务上架
使用springboot提供的@EnableScheduling(开启定时任务功能),@EnableAysnc(开启异步任务功能)
使用@Aysnc,@Scheduled开启异步定时任务

1.秒杀服务中开启定时任务查询以下信息
1.1product服务中查询最近三天的秒杀活动信息
1.2product服务中查询秒杀sku信息
2.将扫描到的活动信息,和关联的sku信息缓存到redis中
2.1缓存活动信息,每个活动的开始时间_结束时间作为key , 活动场次的id_商品集合的id作为value,放入缓存
2.2缓存活动关联的sku信息,存储格式为hash,存储的键值为, 将活动场次的id_商品集合的id作为hashmap的key,每场活动的sku集合的json串作为hashmap的value,放入缓存
2.3保存每个sku秒杀的结束时间和开始时间(与活动时间相同),封装到2.2操作的sku集合实例中
2.4设置sku秒杀随机码(使用uuid),秒杀操作时携带,key为每个sku的id(防止恶意访问),放入缓存
3.设置商品分布式信号量(引入redisson实现,限流)
为每个sku设置,信号量名称为 seckill:stock+商品随机码,值为秒杀sku的库存数

分布式集群下幂等性保证
使用分布式锁保证集群下,不会多个集群服务同时触发上架定时任务
使用redis 的key唯一性保证幂等性
保证场次唯一(查询redis是否存在活动的开始时间_结束时间这个key,先去redis查询当前活动是否已经存在,存在就不进行再次存入redis操作)
sku的集合信息幂等使用(查询redis是否存在 活动场次的id_商品集合的id key ),sku秒杀随机码,和保存信号量也要进行幂等性保证操作。

3.秒杀实现

查询秒杀商品,页面展示 (每个查询的远程调用都使用异步编排异步查询)

1.获取当前时间可以参与的秒杀的信息
2.根据上面查出秒杀的信息的value,关联秒杀的商品的key去redis查询找到所有需要参与参与秒杀的商品信息
3.展示各个商品信息,秒杀场次的id,sku的id,sku的随机码,等

高并发秒杀设计

(每次12毫秒,每秒一个线程能处理将近100个请求,一个tomcat有300个线程处理请求 就是每秒3000请求,后期用户量大可以做集群,处理速度为机器个数的倍数增加)
在这里插入图片描述
在这里插入图片描述
1.点击立即抢购携带页面的"场次id_skuid",商品随机码,秒杀数量参数
2.登录验证:
2.1拦截器自定义拦截器实现HandlerInterceptor,
2.2将拦截器配置在web配置中:自定义web配置配实现WebMvnConfig,重写addInterceptors(),配置拦截路径。
3.合法性校验:
3.1根据携带的 “场次id_sku的id” 获取当前秒杀商品的详细信息
3.2从redis取出商品的开始时间和结束时间判断是否在秒杀时间内
3.3从redis取出对应商品随机码和页面携带的随机码比对,
3.4验证购物数量,取出redis中商品的的信号量,和页面传递的数量比较
3.5幂等性,只能买一次,每次秒杀就使用redis的setnx占位,占位的key为"用户id_场次id_skuid",若占位命令返回true就是没有购买,
4.获取信号量
4.1使用redisson获取商品信号量(键为商品上架时设置的信号量的key)根据购买数量尝试取出信号量,若成功就进入生成订单功能
5.快速下单
5.1封装下单需要的数据,向消息队列发送消息,
5.2在订单系统创建交换机、队列、绑定并监听消息队列
5.3监听到消息,使用接收到的数据创建秒杀订单,保存订单,调用支付接口付款成功

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值