- 商品详情页-购买-订单确认页(此时还没有生产订单只是商品数据可来自缓存)-提交订单(执行2-7逻辑)-支付页
- 缓存中预热的(提前从数据库中把数据放入缓存)是要参加秒杀商品信息(包括库存数量),并对商品设置过期时间,这个时间应该是秒杀商品的结束时间,这么做主要是缓解数据库压力提升响应速度。
- 并发秒杀(提交订单)时候先从缓存中查询是否有此商品,没有说明秒杀结束了,有的话去预扣商品的库存数量。
- 如果预扣成功说明库存充足可以下单,响应给前端一个状态,并去发消息到消息中间件,订单服务去消费此消息然后开始真正的数据库库存扣减,扣减成功开始生成订单并入库。异步解耦订单生成逻辑提升下单接口吞吐量。
- 前端订单确认页面可以去轮询查询订单生成结果,一般有三种结果:生成订单失败既秒杀失败或者还未消费到消息(排队中)如果成功则去支付页面。
- 这里的异步生成订单不存在分布式事务问题,因为预扣库存仅仅是去缓存中扣减库存数量,如果此时失败并不会发送消息,如果成功那么消息也应该被消费。由于采用是轮询结果的方式所以即便订单生成失败用户重新下单即可并不是必须要保证最终一致的场景。
- 订单成功后是从数据库获取的订单信息缓存中并没有。