消息中间件之RocketMQ源码分析(二十四)

事务消息

事务消息机制。

事务消息的发送和处理总结为四个过程:

1.生产者发送事务消息和执行本地事务

2.Broker存储事务消息

3.Broker回查事务消息

4.Broker提交或回滚事务消息

生产者发送事务消息和执行本地事务。

发送过程分为两个阶段:

第一阶段,发送事务消息

第二阶段,发送endTransaction消息

事务消息发送过程的实现类TransactionMQProducer,该类继承鱼DefaultMQProducer,不仅能发送事务消息,还能发送其他消息。虽然4.2.0版本有事务消息代码,但实际是4.3.0版本才全面支持事务消息。

TransactionMQProducer的核心属性和方法:

  • transactionListener:事务监听器,主要功能是执行本地事务和执行事务回查。事务监听器包含executeLocalTransaction()和checkLocalTransaction()两个方法。executeLocalTransaction()方法执行本地事务,checkLocalTransaction()方法是当生产者由于各种问题导致未发送Commit或Rollback消息给Broker时,Broker回调生产者查询本地事务专改的处理方法

  • executorService:Broker回查请求处理的线程池
  • start():事务消息生产者启动方法,与普通启动方法不同,增加了this.defaultMQProducerImpl.initTransactionEnv()的调用,即增加了初始化事务消息的环境信息

    事务消息的环境初始化主要用于初始化Broker回查请求处理的线程池,
    在初始化事务消息生产者时我们可以指定初始化对象,如果不指定初始化对象,那么这里会初始化一个单线程的线程池
  • shutdown():关闭生产者,回收生产者资源。该方法时启动方法的逆过程,功能时关闭生产者、销毁事务环境。销毁事务环境是指销毁事务回查线程池,清楚回查任务队列


生产者发送事务消息主要分为如下两个阶段:

1.发送Half消息的过程

2.发送Commit或Rollback消息

发送Half消息的过程。

事务消息的发送是通过sendMessageInTransaction()方法来完成的

  • 第一步,数据校验,判断TransactionListener的值是否为null、消息Topic为空检查、消息体为空检查等


  • 第二步:消息预处理。预处理的主要功能是在消息扩展字段中设置消息类型。MessageConst.PROPERTY_TRANSACTION_PREPARED表示当前消息是事务Half消息。MessageConst.PROPERTY_PRODUCER_GROUP用于设置发送消息的生产者组名,以及设置事务消息的扩展字段
  • 第三步:发送事务消息,调用同步发送消息的方法将事务消息发送出去

发送Commit或Rollback消息

在本地事务处理完成后,根据本地事务的执行结果调用DefaultMQProducerImpl.endTransaction()方法

通知Broker进行Commit或Rollback

当前Half消息发送完成后,会返回生产者消息发送到哪个Broker、消息位点是多少、再根据本地事务的执行

结果封装EndTransactionRequestHeader对象,最后调用MQClientAPIimpl.endTransactionOneway()方法

通知Broker进行Commit或Rollback

  • brokerAddr:存储当前Half消息的Broker服务器的socket地址
  • localTransactionState:本地事务执行结果
  • transactionId:事务消息的事务id
  • endTranactionOneway():以发送oneway消息的方式发送该RPC请求给Broker.
相关推荐
大道之简4 分钟前
PostgreSQL pgvector向量数据库
数据库·postgresql
yfhmmm5 分钟前
PostgreSQL如何进行时间点恢复(PITR)
数据库·postgresql
Yusei_052316 分钟前
Redis核心特性与应用全解析
开发语言·数据库·c++·redis·缓存
SAP小崔说事儿9 小时前
在数据库中将字符串拆分成表单(SQL和HANA版本)
java·数据库·sql·sap·hana·字符串拆分·无锡sap
川贝枇杷膏cbppg10 小时前
asmcmd
数据库·oracle
JIngJaneIL11 小时前
基于java+ vue助农电商系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
IndulgeCui11 小时前
基于CentOS7 DM8单机部署配置记录-20251216
数据库
surtr111 小时前
关系代数与关系型数据库
数据库·sql·数据库系统
学海_无涯_苦作舟11 小时前
MySQL面试题
数据库·mysql·面试
老邓计算机毕设11 小时前
SSM校内二手书籍交易系统的设计与实现an1k0(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·ssm 框架开发·ssm 校内二手书籍交易系统