1.缓存秒杀商品库存到redis
2.用户访问秒杀商品,进行商品的抢购
3.判断用户是否存在未支付的秒杀订单,如果存在,告知用户,请先支付。(幂等)
4.判断排队人数是否达到上线。redis ,incrment() 达到上线,直接返回,请稍后重试
//后面的请求都是异步请求 (spring @Async 线程池)
5.排队人数没有达到上线,存储当前用户的排队信息,进行库存的预扣减, 使用 redis decrment 进行库存的自减操作。
6.创建秒杀订单对象(skillOrder) 发送消息给订单微服务,和库存微服务
7.订单微服务,把订单存储到mysql 表中。 为什么需要MQ进行远程调用,因为可以MQ的QOS预抓取总是,防止请求的洪灾
8.库存微服务,根据购买的商品,增减数据库秒杀商品的库存信息 ,发送延迟消息给MQ 15分钟
9.如果用户抢购成功,但是15钟没有支付,补偿,关闭订单支付通道 ,回滚商品的库存,。
10.如果抢购并且支付,微信回调接口修改订单的支付状态,并且更新用户的抢购排队信息。
存在问题:
1.如何防止超卖?redis 预扣减库存 + decrment
2.如何防止用户恶意访问 ? redis + incrment 防止用户重复排队 (实现防止恶意刷单)
3.支付失败怎么办?延迟队列,15分钟未支付,回滚用户的库存信息
4.实现防止相同商品重复秒杀 ? 在用户请求进来后,马上就判断,用户是否redis 存储已经下单的数据
5.实现下单接口限流?AOP令牌桶限流
6.实现秒杀下单接口隐藏?1.新增一个方法,生成一个code码返回给前端。 2.用户在秒杀请求发送之前,先调用新增方法,生成一个code码,然后携带code码,才能访问秒杀接口。