订单服务 + 库存服务
1.订单服务中前端请求创建订单,计算商品的价格、数量等信息存储到订单表中
2.订单服务向库存服务发送扣减库存的请求(远程调用)
-
transaction_log:事务日志表。记录扣减库存事务msg的事务Id和订单id
-
OrderTransactionMQProducer:订单事务msg生产者
-
OrderTransactionListener:订单事务msg监视器
-
executeLocalTransaction:执行本地事务
createOrder:创建订单,拿到事务msg的transactionId插入到事务日志表
本地事务已提交,则return commit 状态
本地事务回滚,则return rollback 状态
本地事务处于未知状态,则return unkown 状态 -
checkLocalTransaction:事务回查判断本地事务状态。如果executeLocalTransaction返回unkown状态,则会进入此回查方法
queryTransactionLog(transactionId)
大于>0:本地事务执行成功
小于<0:本地事务未知(unkown),继续重试回查,尝试到一定次数后,发送短信通知人工处理
-
-
生产端出现异常如何保证事务一致性
1.createOrder本地事务发生异常,return rollback回滚事务msg
2.createOrder本地事务成功,但是由于网络故障等原因未能及时返回本地事务状态或者返回了未知状态。那么会有MQ Broker定时进行事务回查,根据事务日志表确保本地事务状态 -
库存服务消费事务msg
subtractStock():扣减库存。
注意幂等性问题。根据orderSn查询库存任务单,>0则已经扣减过,<0才进行扣减 -
消费异常
消息消费失败,进行重拾(默认最多重试16次).
当超过最大重试次数:
1.通知人工进行处理(短信方式)
2.进入死信队列,通过专门的程序来监听处理死信消息,人工介入或者控制台查看处理。