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

Broker提交或回滚事务消息

当生产者本地事务处理完成并且Broker回查事务消息后,不管执行Commit还是Rollback,都会根据用户本地事务的执行结果发送一个End_transaction的RPC请求给Broker,Broker端处理该请求的类是EndTransactionProcessor
在这里插入图片描述

第一步,End_Transaction请求校验,主要检查项如下

1.Broker角色检查。Slave Broker不处理事务消息
2.事务消息类型检查。EndTransactionProcessor只处理
Commit或Rollback类型的事务消息,其余消息不处理,这里区分了事务回查
在这里插入图片描述
在这里插入图片描述

第二步,进行Commit或Rollback。

根据生产者请求头中的参数判断,是Commit请求还是Rollback请求,然后分别进行处理
在这里插入图片描述

commitMessage()

提交Half消息/这是事务消息服务接口中的一个方法,根据消息位点查询了Half消息,并将Half消息返回
在这里插入图片描述
在这里插入图片描述

checkPrepareMessage()

Half消息数据校验。校验内容包括发送消息的生产者组与当前执行Commit/Rollback的生产者是否一致,当前Half消息是否与请求Commit/Rollback的消息是否是同一条消息
在这里插入图片描述

endMessageTransaction()

消息对象类型转化,将MessageExt对象转化为MessageExtBrokerInner对象,并且还原消息之前的Topic和ConsumeQueue等信息
在这里插入图片描述

sendFinalMessage()

将还原后的事务消息最终发送到CommitLog中,一旦发送成功,消费者就可以正常拉取消息并消费
在这里插入图片描述

deletePrepareMessage()

在sendFinalMessage()执行成功后,删除Half消息。其实RocketMQ是不能真正删除消息的,其实质是顺序写磁盘,相当于做了一个"假删除"。"假删除"通过putOpMessage()方法将消息保存到TransactionMessageUtil.
buildOpTopic()的Topic中,并且做上标记TransactionalMessageUtil.REMOVETAG,表示消息已删除
在这里插入图片描述

  • 如果消息被标记为已删除,则调用addRemoveTagInTransactionOp()方法,利用标记为已删除的OP消息构造Message消息对象,并且调用存储方法保存消息
    在这里插入图片描述
  • TransactionalMessageUtil.buildOpTopic()方法跟保存Half消息时的逻辑类似
    在这里插入图片描述
  • Half消息保存在名为MixAll.RMQ_SYS_TRANS_HALF_TOPIC的Topic中,执行Commit和Rollback后的消息都保存在MixAll.RMQ_SYS_TRANS_OP_HALF_TOPIC
    对象中,以便Broker判断是否需要回查生产者事务的执行状态。
    在这里插入图片描述
    在这里插入图片描述
  • 调用存储层方法,真正地将OP消息保存到了CommitLog中
    在这里插入图片描述

Rollback实现逻辑

Rollback并没有真正删除消息,而是标记Half消息为删除,在Broker回查时机会跳过不检查
在这里插入图片描述

rollbackMessage()

该方法与CommitMessage()方法一样,都是查询Half消息并返回消息对象。

checkPrepareMessage()

消息校验,与Commit调用的是同一个方法

deletePrepareMessage()

删除Half消息,与Commit调用的是同一个方法

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

记录github中那个是正常的文件下载的方式,idm正确的使用方式

百度网盘下载速度 文件说明 后缀 tar.gz 是linux 文件 zip 是 压缩文件不知道是哪个压缩文件 github 中的文件难下载 刚才我下载的时间是10.05出现了文件中断的清空 无法下载 第一个文件下载好的样子 还是用这个良心 20230924-1DM脚本激活 下载完成没有说怎么使用 我之前使用…

用python和pygame库实现刮刮乐游戏

用python和pygame库实现刮刮乐游戏 首先,确保你已经安装了pygame库。如果没有安装,可以通过以下命令安装: pip install pygame 示例有两个。 一、简单刮刮乐游戏 准备两张图片,一张作为背景bottom_image.png,一张作…

【详识JAVA语言】数组练习

数组转字符串 代码示例 import java.util.Arraysint[] arr {1,2,3,4,5,6};String newArr Arrays.toString(arr);System.out.println(newArr);// 执行结果 [1, 2, 3, 4, 5, 6] 使用这个方法后续打印数组就更方便一些. Java 中提供了 java.util.Arrays 包, 其中包含了一些操…

Nacos 2.3.0 安装配置详细流程(2.x.x版本基本都适用)

目录 1. 下载Nacos2. Nacos启动前的准备3. 可选:开启登录验证4. 启动服务器 1. 下载Nacos Nacos 2.3.0 Windows安装包下载地址:点击下载 其他版本下载:https://github.com/alibaba/nacos/releases 2. Nacos启动前的准备 创建数据库&#…

大小端问题

0. 介绍 大小端计算机存储数据而安排字节的两种顺序。 针对的是字节。 大端与我们平时书写的顺序一致。 1. 大小端的判定 不需要手动判断。 有一个头文件endian.h; 可能会有宏 __BYTE_ORDER __BIG_ENDIAN __LITTLE_ENDIAN通过库来进行判断。 手动判断 根据字节存取的顺序…

Shell输入输出重定向

Linux Shell 重定向分为两种,一种输入重定向,一种是输出重定向。其实输入输出方向就是数据的流动方向: 输入方向:就是数据从哪里流向程序。数据默认从键盘流向程序,如果改变了它的方向,数据就从其它地方流…

LLM 系列——BERT——论文解读

一、概述 1、是什么 是单模态“小”语言模型,是一个“Bidirectional Encoder Representations fromTransformers”的缩写,是一个语言预训练模型,通过随机掩盖一些词,然后预测这些被遮盖的词来训练双向语言模型(编码器…

最新 Node 初始化 vue 项目报错(npm init vue@latest)以及配置淘宝镜像(cnpm)

最新 Node 初始化 vue 项目报错(npm init vuelatest)以及配置淘宝镜像(cnpm) PS E:\SpringBootBase\ProjectOne\big-event-vue> cnpm init vuelatest cnpm : The term ‘cnpm’ is not recognized as the name of a cmdlet, fu…

加密隧道技术

在现在的互联网上传输数据,首要考虑的就是安全。这关乎到你的隐私,个人信息,财产安全等等重大问题。如果你的程序本身传输的信息没有加密,也可以通过其他辅助方式让你的通信加密。一些工具的就是为了解决这样的场景的,…

文心一言 VS 讯飞星火 VS chatgpt (206)-- 算法导论15.4 3题

三、设计 LCS-LENGTH的带备忘的版本,运行时间为O(mn)。需要写代码的时候,请用go语言。 文心一言,代码正常运行: LCS-LENGTH(Longest Common Subsequence Length)问题的带备忘的版本通常指的是使用动态规划…

springboot+vue学生网上请假系统

学生网上请假系统 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了学生网上请假系统的开发全过程。通过分析学生网上请假系统管理的不足,创建了一个计算机管理学生网上请假系统的方案。文章介绍了…

社区店经营全攻略:为何成为创业者的首选?

在当今的创业环境中,社区店越来越受到创业者的关注和青睐。 作为一名开鲜奶吧5年的创业者,我见证了无数的实体项目,这篇文章,为大家深入解析社区店的优势,以及为何它成为了众多创业者的首选。 社区店的主要优势在于以…

自注意力机制(Self-Attention)

注意:本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站(【http://www.aideeplearning.cn】) Transformer模型中最关键部分就是自注意力(Self-Attention)机制,正如 Transformer 的论文的标题是“…

ConcurrentHashMap的演进:从Java 8之前到Java 17的实现原理深度剖析

目录 一、引言二、Java 8之前的ConcurrentHashMap1、内部结构与初始化2、Segment类3、并发控制4、扩容与重哈希5、总结 三、Java 8中的ConcurrentHashMap1、数据结构2、并发控制2.1. CAS操作2.2. synchronized同步块 3、哈希计算与定位4、扩容与重哈希5、总结 四、Java 17中的C…

Docker知识点总结

二、Docker基本命令: Docker支持CentOs 6 及以后的版本; CentOs7系统可以直接通过yum进行安装,安装前可以 1、查看一下系统是否已经安装了Docker: yum list installed | grep docker 2、安装docker: yum install docker -y -y 表示自动确认…

安装Realtek Audio Driver失败[Error Code:-0001]

安装Realtek Audio Driver失败[Error Code:-0001] 首先来看一下我们遇到的问题GPT4的推荐解决方法(流水账)笔者自己真实有效的解决办法 首先来看一下我们遇到的问题 描述:在笔记本更新完电脑之后,没有自带声音驱动。然…

【LeetCode】升级打怪之路 Day 11:栈的应用、单调栈

今日题目: Problem 1: 栈的应用 155. 最小栈 | LeetCode20. 有效的括号 | LeetCode150. 逆波兰表达式求值 | LeetCode Problem 2: 单调栈 496. 下一个更大元素 I739. 每日温度503. 下一个更大元素 II 目录 Problem 1:栈 - “先进后出”的应用LC 155. 最…

2024龙年特别篇 -- 魔法指针 之 指针变量

目录 ​编辑 字符指针变量 字符指针 字符数组 关于字符数组的试题 数组指针变量 数组指针 利用指针数组打印数组 打印二维数组 数组作为形参 当形参为指针时(指针数组) 函数指针变量 利用函数实现加法输出的多种方式 字符指针变量 字符指针 char …

[NSSCTF 2nd] web复现

1.php签到 <?phpfunction waf($filename){$black_list array("ph", "htaccess", "ini");$ext pathinfo($filename, PATHINFO_EXTENSION);foreach ($black_list as $value) {if (stristr($ext, $value)){return false;}}return true; }if(i…

CKA考生注意:这些Deployment要点能助你一臂之力!

往期精彩文章 : 提升CKA考试胜算&#xff1a;一文带你全面了解RBAC权限控制&#xff01;揭秘高效运维&#xff1a;如何用kubectl top命令实时监控K8s资源使用情况&#xff1f;CKA认证必备&#xff1a;掌握k8s网络策略的关键要点提高CKA认证成功率&#xff0c;CKA真题中的节点维…