RocketMQ解决分布式事务案例

借鉴总结自原文链接
好文参考

订单服务 + 库存服务

1.订单服务中前端请求创建订单,计算商品的价格、数量等信息存储到订单表中
2.订单服务向库存服务发送扣减库存的请求(远程调用)

  1. transaction_log:事务日志表。记录扣减库存事务msg的事务Id和订单id

  2. OrderTransactionMQProducer:订单事务msg生产者

  3. OrderTransactionListener:订单事务msg监视器

    • executeLocalTransaction:执行本地事务
      createOrder:创建订单,拿到事务msg的transactionId插入到事务日志表
      本地事务已提交,则return commit 状态
      本地事务回滚,则return rollback 状态
      本地事务处于未知状态,则return unkown 状态

    • checkLocalTransaction:事务回查判断本地事务状态。如果executeLocalTransaction返回unkown状态,则会进入此回查方法

      ​ queryTransactionLog(transactionId)

      ​ 大于>0:本地事务执行成功
      ​ 小于<0:本地事务未知(unkown),继续重试回查,尝试到一定次数后,发送短信通知人工处理

  1. 生产端出现异常如何保证事务一致性
    1.createOrder本地事务发生异常,return rollback回滚事务msg
    2.createOrder本地事务成功,但是由于网络故障等原因未能及时返回本地事务状态或者返回了未知状态。那么会有MQ Broker定时进行事务回查,根据事务日志表确保本地事务状态

  2. 库存服务消费事务msg

    ​ subtractStock():扣减库存。
    ​ 注意幂等性问题。根据orderSn查询库存任务单,>0则已经扣减过,<0才进行扣减

  3. 消费异常

    ​ 消息消费失败,进行重拾(默认最多重试16次).
    ​ 当超过最大重试次数:
    ​ 1.通知人工进行处理(短信方式)
    ​ 2.进入死信队列,通过专门的程序来监听处理死信消息,人工介入或者控制台查看处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值