分布式事务-RocketMQ事务消息源码分析

前言

上篇文章介绍了RocketMQ事务消息的基本原理,对大致的流程及设计思路有个大致的了解

分布式事务-RocketMQ消息事务设计思路及Demo

文章最后,也提出了几个问题

  1. 为什么prepare消息在发送后不会被消费?
  2. 事务消息又是如何提交、回滚的?
  3. 定时回查本地事务状态的机制又是怎么样?

废话不多说,直接盘源码,从源码中找问题答案,源码中都加了todo注释,方便大家查看

发送流程

先从事务消息发送方法入手TransactionMQProducer#sendMessageInTransaction
在这里插入图片描述
进到DefaultMQProducerImpl#sendMessageInTransaction方法
在这里插入图片描述
这是一个典型的两阶段提交过程 步骤1、2为第一阶段,步骤3为第二阶段
1、producer发送prepare消息给mq服务器
2、如果消息发送成功,执行本地事务,同时将消息transactionId与业务操作一并入库,方便后续事务回查
3、根据本地事务执行状态,决定是否对prepare消息进行提交/回滚,本地事务执行状态有下面几种
在这里插入图片描述

这时候再反过来看事务消息原理设计图,是不是清晰很多
在这里插入图片描述
方法中还剩两个关键方法

  1. this.send(msg)
  2. this.endTransaction(sendResult, localTransactionState, localException)

下面逐个分析,先看消息发送send()方法

事务消息发送

事务消息的发送,会执行到DefaultMQProducerImpl#sendDefaultImpl方法,再调用DefaultMQProducerImpl#sendKernelImpl方法发送消息,下面只贴出与事务消息相关代码

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值