消息中间件之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.
相关推荐
WuMingf_几秒前
redis
数据库·redis
张某布响丸辣7 分钟前
SQL中的时间类型:深入解析与应用
java·数据库·sql·mysql·oracle
P.H. Infinity1 小时前
【RabbitMQ】10-抽取MQ工具
数据库·分布式·rabbitmq
zgscwxd1 小时前
thinkphp6 --数据库操作 增删改查
数据库·thinkphp6
代码小鑫2 小时前
A031-基于SpringBoot的健身房管理系统设计与实现
java·开发语言·数据库·spring boot·后端
天天要nx2 小时前
D64【python 接口自动化学习】- python基础之数据库
数据库·python
精进攻城狮@2 小时前
Redis(value的数据类型)
数据库·redis
爪哇学长3 小时前
SQL 注入详解:原理、危害与防范措施
xml·java·数据库·sql·oracle
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ3 小时前
mybatisPlus打印sql配置
数据库·sql