消息中间件之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.
相关推荐
Live&&learn15 分钟前
Redis语法入门
数据库·redis
未羽出衫22 分钟前
DB-GPT本地模型+tuGragh安装使用
数据库·gpt
忧郁蓝调2624 分钟前
Redis不停机数据迁移:基于 redis-shake 的跨实例 / 跨集群同步方案
运维·数据库·redis·阿里云·缓存·云原生·paas
VekiSon27 分钟前
数据库——基础概念与 SQLite 实践
数据库·sqlite
点云SLAM29 分钟前
Boost中Graph模块中boost::edge_capacity和boost::edge_capacity_t
数据库·算法·edge·图论·最大团·最大流算法·boost库使用
五阿哥永琪30 分钟前
Redis的常用数据结构
数据结构·数据库·redis
猴子年华、36 分钟前
【每日一技】:SQL 常用函数实战速查表(函数 + 场景版)
java·数据库·sql·mysql
远方160938 分钟前
110-Oracle中核心业务的年度分区表建立
数据库·oracle·database
__风__41 分钟前
PostgreSQL 约束延迟触发
数据库·postgresql
月明长歌41 分钟前
MySQL数据库约束:把“能插入”升级成“插入就对”
数据库·mysql·oracle