消息中间件之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.

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/711189.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Expression Language (SpEL)

Spring 表达语言(SpEL),支持在运行时查询和操作对象图,可以用于数据绑定、属性访问、方法调用等。使用SpEL可以简化代码并提高应用程序的可维护性。 1 概览 SpelExpressionParser是SpEL的一个核心组件,负责解析和编译…

CentOS安装编译Python3.11.6

CentOs自带python2版本太低,项目需要python3,于是自己安装python 操作指南: 重新下载源代码: # 删除旧的 Python 源代码文件(如果有) rm -rf Python-3.11.6.tar.xz # 下载 Python 3.11.6 的源代码文件 wget…

Java泛型简介

Java泛型简介 Java泛型是在Java 5中引入的一个特性,它允许程序员在编译时指定类、接口或方法能够接受的类型。泛型的主要目的是提供编译时类型安全检查,避免在运行时因为类型转换错误而导致的ClassCastException。 在没有泛型之前,Java中的集…

如何利用动态静态代理IP实现跨地域网络营销与市场研究

动态代理IP和静态代理IP都可以在跨地域网络营销与市场研究中发挥关键作用,具体实现方式如下: ### 动态代理IP的应用: 1. 跨地域营销活动测试: - 在进行网络营销时,尤其是要验证广告投放、SEO效果或A/B测试不同地区用户…

Ubuntu系统使用Docker搭建Jupyter Notebook并实现无公网ip远程连接

文章目录 1. 选择与拉取镜像2. 创建容器3. 访问Jupyter工作台4. 远程访问Jupyter工作台4.1 内网穿透工具安装4.2 创建远程连接公网地址4.3 使用固定二级子域名地址远程访问 本文主要介绍如何在Ubuntu系统中使用Docker本地部署Jupyter Notebook,并结合cpolar内网穿透…

C语言系列(所需基础:大学C语言及格)-4-转义字符/注释/选择语句

文章目录 一、转义字符二、注释三、选择语句 一、转义字符 加上\会讲原来的字符改变意思,即进行转义 例如\t会使t变成\t用于表示转义字符,使得t转义成水平制表符 其他转义字符: 三字母词(展示\?的用处)…

C#面:接口是一种引用类型,不可以声明公有的域或私有的成员变量,但是可以声明什么呢?

可以声明:方法,属性,索引器,事件。 接口的主要作用是定义一套规范,使得不同的类可以按照相同的规范进行交互。通过实现接口,类可以具备多态性,即可以以接口类型来引用对象,并调用接…

k8s-001-Centos7内核升级

1. 查看内核 [rootlocalhost ~]# uname -a 2. 执行的命令(安装最新版内核): 下载: rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org 安装: rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm ( 查看最新版内核&…

杭州默安-安全技术实习生-一面

1.自我介绍 略 2.专业主修的课程 略 3.xss漏洞的类型,原理及防御 原理,服务器对用户的输入过滤不严格,将用户的输入当作Javascript代码执行并返回给客户端。 防御,输入和url参数过滤,HTML实体编码转义特殊字符。…

力扣hot100题解(python版33-35题)

33、排序链表 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4]示例 2: 输入:head [-1,5,3,4,0] 输出:[-1,0,3,4,5]示例 3&a…

kafka架构详解

文章目录 概述kafaka架构Kafka的设计时什么样的Zookeeper 在 Kafka 中的作用知道 概述 Apache Kafka 是分布式发布 - 订阅消息系统,在 kafka 官网上对 kafka 的定义:一个分布式发布 - 订阅消息传递系统。 Kafka 最初由 LinkedIn 公司开发,Li…

mysql 中 auto_increment 自增约束的用法和配置

自增约束 int字段 特殊约束条件,用于为表中写入新的记录生成唯一的值,一个表中只能有一个自增约束字段 格式 字段 数据类型 auto_increment 创建带有自增约束的表 create table student_game_auto ( id int unique auto_increment, name char(5),…

蚂蚁集团推动编制的全球首个隐私计算一体机国际标准发布

近日,IEEE 标准协会(IEEE-SA)正式发布并推行了由我国企业主导的全球首个隐私计算一体机国际标准《隐私计算一体机技术要求》(IEEE 3156-2023)。IEEE-SA是权威国际标准制定机构,该标准的成功发布意味着中国的…

numpy常见操作

返回各维度元组print(img.shape)返回大小img.size返回各维度数据类型print(img.dtype) 数据类型变int8maskmask.astype(np.int8) 注意int32可变float64 但float64变int32会把小数截断 string_可变float64 NumPy常见操作: import numpy as np 创建一个一维数组 ar…

继承-学习2

this关键字:指向调用该方法的对象,一般我们是在当前类中使用this关键字,所以我们常说代表本类对象的引用 super关键字:代表父类存储空间的标识(可看作父类对象的引用) 父类: package ven;public class Fu {//父类成员…

操作系统面经

1. 进程和线程的区别? 调度:进程是资源管理的基本单位,线程是程序执行的基本单位。切换:线程上下文切换比进程上下文切换要快得多。拥有资源: 进程是拥有资源的一个独立单位,线程不拥有系统资源&#xff0…

unity自定义着色器基础

这些内置渲染管线的着色器示例演示了编写自定义着色器的基础知识,并涵盖了常见的用例。 有关编写着色器的信息,请参阅编写着色器。 设置场景 第一步是创建一些用于测试着色器的对象。在主菜单中选择 Game Object > 3D Object > Capsule。然后&a…

高光谱遥感学习入门丨高光谱数据处理基础、Python和Matlab高光谱遥感数据处理

目录 ①Python高光谱遥感数据处理与高光谱遥感机器学习方法深度应用 ②Matlab高光谱遥感、数据处理与混合像元分解实践技术应用 ③高光谱遥感数值建模技术及在植被、水体、土壤信息提取领域应用 更多应用 高光谱遥感信息对于我们认识世界具有重要意义。尽管大部分物质在人眼…

记录 | docker权限原因导致service ssh start失败

【报错】 容器内启 ssh server 报错 有两个错: (1)/etc/ssh/sshd_host_rsa_key 权限太高; (2)/run/sshd用户组不为 root 解决方法: 方法一: 各自容器内对/etc/ssh/sshd_host_r…

【前端素材】推荐优质后台管理系统 Adminity平台模板(附源码)

一、需求分析 1、系统定义 后台管理系统是一种用于管理网站、应用程序或系统的管理界面,通常由管理员和工作人员使用。它提供了访问和控制网站或应用程序后台功能的工具和界面,使其能够管理用户、内容、数据和其他各种功能。 2、功能需求 后台管理系…