一个单独的电商服务
1.同步扣库存
在订单生成的时候直接扣库存,这是最初等的方式扣库存,这种方式比较简单,但是也有一系列的问题:
1.1、会造成有很多订单把产品库存扣除而并没有支付,这就需要有一个后台脚本,将一段时间内没有支付的订单的库存释放,把订单取消掉
1.2、即时扣库存,并发差
2.异步扣库存
对于电商系统,譬如某狗东,会注意到,当订单支付成功后,会有一个出库过程,既然有这个过程,就有可能出库失败, 他的流程是怎么样子的呢?(下面是讨论的结果,本人并不实际了解狗东的流程)
库存有两部分:一个缓存redis层,一个数据库mysql层
2.1当客服新增了5个库存,那么,缓存redis和数据库mysql层都需要增加5个库存,这个使用分布式事务的最终一致性来满足要么全加,要么全不加库存。
2.2当订单生成的时候,需要扣除库存,先扣除redis库存,如果扣除成功,则生成订单进行支付,注意,这个过程是不扣除mysql库存的。
2.3当redis库存扣干净了,那么这个产品就无法下单了,下单就会失败,就把外层的给挡住了。
2.4在2.2步扣除redis库存成功后,生成订单,进行支付,支付成功,返回我的订单中心, 会发现有一个出库过程
2.5出库过程是一个MQ异步解耦的任务队列,这个过程是扣除mysql产品库存,如果扣除数据库mysql产品库存成功,那么出库成功