消息中间件之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.
相关推荐
wyiyiyi5 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
天宇_任5 小时前
Mysql数据库迁移到GaussDB注意事项
数据库·mysql·gaussdb
悟能不能悟6 小时前
MQ积压如何处理
java-rocketmq
xiep14383335108 小时前
Ubuntu 安装带证书的 etcd 集群
数据库·etcd
Java小白程序员9 小时前
Spring Framework:Java 开发的基石与 Spring 生态的起点
java·数据库·spring
老虎06279 小时前
数据库基础—SQL语句总结及在开发时
数据库·sql·oracle
爱掘金的土拨鼠11 小时前
国产化dm数据库锁表解锁
数据库
庖丁解java11 小时前
N个Utils
数据库
Mr. zhihao12 小时前
SQL LEFT JOIN 与 WHERE 条件的隐藏坑
数据库·sql
2301_7930868712 小时前
Redis 04 Reactor
数据库·redis·缓存