分布式数据一致性解决方案,下单流程

数据库包含
1:会员库(会员数据,优惠券数据)
2:商品库(商品数据,库存数据)
3:订单库(订单表、订单明细表,下单事件表)

订单系统下单处理流程

1:用户提交订单前先检测资源可用性(库存,账户余额,优惠券等),如果检测不通过,则返回失败;如果成功则进入下一步

2:生成订单号,并将订单信息推送到消息中间件,如果该步骤失败,则流程结束;
   如果成功,则跳转到下单结果查询页,并使用轮训查询订单(或者websocket),根据查询结果决定是跳转到支付页(订单未支付)还是跳转到订单详细页(订单以付款)

3:在信息中间件的消费者端监听下单消息,获取到下单消息的时候

3.1:写入下单事件表(操作订单库)(订单id,库存回滚状态,优惠券回滚状态,余额回滚状态,确认状态 0 待确认  1已确认,检测时间(插入记录的时间往后延5分钟,给后续动作留足时间)),如果失败,流程结束;成功则进入下一步

3.2:调用库存接口(操作商品库)扣减库存(记录订单号),如果失败,流程结束,如果成功则进入下一步

3.3:(如果订单使用了优惠券)调用优惠券接口(操作会员库)修改优惠券状态为已使用(优惠券记录对应的订单号),如果失败,结束流程;如果成功则进入下一步

3.4:(如果订单使用余额支付)调用扣减用户账户余额接口(操作会员库)扣减余额(记录对应订单号),如果失败结束流程,成功则进入下一步

3.5:生成订单(操作订单库),如果成功后第2步中的轮训操作可以查到该订单,流程结束;如果失败则返回,并且流程结束

4:容错机制:

4.1:后台开启多个线程轮训下单事件表中待确认的记录,拿到订单号,然后去查询该订单是否已经生成,如果已经生成,说明数据一致性没有问题,那么将该记录更新为已确认;
     如果订单不存在,说明中间某个步骤出了问题

4.2:如果下单事件表中库存回滚状态为“已回滚”,则略过4.2步骤;否则使用订单号去查询库存扣减记录,如果没有库存扣减记录(说明在扣减库存这里就失败了,后续的流程也不会存在),则更新下单事件的状态为以确认;
     如果有库存扣减库存记录,并且该库存扣减记录的回滚标识位为未回滚,则调用库存回滚接口回滚商品库存,如果回滚失败则稍后重试(检测时间再往后延),
如果回滚成功更新库存扣减记录为已回滚,并更新下单事件表中库存回滚状态为已回滚并则进入下一步
如果有扣减库存记录,但该扣减记录已经回滚过,则直接更新下单事件表中的库存回滚状态为已回滚并进入下一步

4.3:如果下单事件表中优惠券回滚状态为“已回滚”,则略过4.3步骤;否则使用订单号去查询优惠券使用记录,如果没有优惠券使用记录(说明该订单没有使用优惠券或者是该订单使用了优惠券但是在更新优惠券这一步失败了),
     则更新优惠券回滚状态为不需要回滚;
     如果查询到优惠券使用记录并且该优惠券使用记录未回滚过则回滚,如果回滚失败则稍后重试(检测时间再往后延),
回滚成功后更新更新优惠券回滚状态为已回滚,并更新下单时间表中的优惠券回滚状态为已回滚,进入下一步;
如果查询到优惠券使用记录并且该优惠券使用记录已经回滚过(但是回滚后更新下单事件表中的优惠券回滚状态失败了),则直接更新下单事件表中的优惠券回滚状态为已回滚并进入下一步

4.4:回滚账户余额,同上

4.5:当所有的回滚操作都要完成则更新下单事件为已确认,容错检测完成

 

该解决方案参考了网上的一篇博客,具体地址不记得了

    原文作者:reborn_wu
    原文地址: https://blog.csdn.net/test1444509256/article/details/80599581
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞