开发者学堂课程【RocketMQ 知识精讲与项目实战(第二阶段):下单问题分析及解决方式】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/703/detail/12349
下单问题分析及解决方式
本节分析在完成综合案例两大功能时有哪些值得关注的问题。
先来查看下单时存在哪些问题,观察流程图
首先用户发起下单请求到达后台系统然后后台系统接收到用户请求后进行扣减库存,再进行使用优惠券,进行余额的使用,再进行订单的确认。
根据基本流程的分析如果在最后确认订单时发生了异常,那么之前扣减的库存优惠券余额都要还原。
观察下面时序图,详细描述了下单全部流程。用户下单后在下单系统,订单系统接收到订单请求后调用订单服务完成下单。
订单服务先进行订单校验,校验订单参数查看是否合法,然后生成预订单,该订单对于用户不可见,然后再通过 rpc方式调用库存方式减库存,调用优惠券扣减优惠券,再调用用户服务完成扣减余额。操作无误后进行第六步,将上述生成的预订单进行确认,将状态改为可见。
以上就是基本流程,但是如果在确认订单时发生异常如何保证回退?在此处再通过 RPC 方式再调用三个服务会造成用户响应时间变长,在既想保证数据回退,又要保障快速处理。
最好的解决方式是使用消息服务:如果 catch 到异常,在订单服务中给 MQ 发送订单确认失败消息,这三个服务分别去监听 MQ 中有没有确认订单失败消息。如果监听到就完成自己的回退操作:回退库存、回退优惠券、回退余额。
此处订单服务也监听消息,若有确认订单失败,就将刚才生成的订单设置为取消。这样通过 MQ 很好的处理了现在的问题,保证了数据的完整性。
以上就是下单时需要关注的问题以及问题基本的解决方案:通过 MQ 保障数据的完整性。