秒杀业务

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码,才能访问秒杀接口。

你可能感兴趣的:(java)