消息中间件之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调用的是同一个方法

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

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

相关文章

volatile 关键字 (一)

volatile 关键字 (一) 文章目录 volatile 关键字 (一)如何保证变量的可见性?如何禁止指令重排序? 文章来自Java Guide 用于学习如有侵权,立即删除 如何保证变量的可见性? 在 Java 中…

【Linux安装软件命令及vim、gcc使用说明】

安装软件命令 Linux安装软件的命令首先要进入管理员权限 首先在终端输入sudo su切换到管理员界面 输入对应的密码,注意这里的密码不会显示出来,输完密码之后回车即可。当出现root就代表已经是管理员界面了。 如果相应退出管理员界面输入exit即可。 注…

django-paramiko远程服务器和文件管理(五)

一、paramiko简介 1.paramiko是一个基于SSHv2协议的纯Python库。需要单独安装。 2.它提供了客户端和服务器的功能。 3.可以实现SSH2远程安全连接,支持用户名、密码连接,也支持密钥连接 4.一般用于执行远程命令、传输文件、中间SSH代理等 安装 pip3 in…

数组、冒泡排序、函数、作用域、对象、Math

数组 1.定义数组: a)通过字面量的方式定义数组 let ary[1,2,3,4]b)通过定义构造函数的方式定义数组: let 数组名new Array(值,值,值);数组的操作方式 a)增 //在数组末尾添加值 arr.push(新增的内容) //在数组的开始添加值 arr.unshift(新增的内容)b…

Redis主从复制+Redis哨兵模式+Redis群集模式

Redis主从复制Redis哨兵模式Redis群集模式一、Redis主从复制1、主从复制的作用2、主从复制过程3、搭建Redis主从复制3.1 所有节点服务器安装redis3.2 修改Redis配置文件(Master节点操作)3.3 修改Redis配置文件(Slave节点操作)3.4 验证主从效果 二、Redis哨兵模式1、哨兵模式的作…

8、IBOScms代码审计

一、sql注入 1、sql注入(Ⅰ) 限制 rreport/api/getlist {"offset":0,"type":"send","keyword":{"subject":"111) AND (updatexml(1,concat(0x7e,(select user()),0x7e),1))-- qw"}}复现 POST /?rreport/api/…

Vue开发实例(十一)用户列表的实现与操作

用户列表的实现与操作 一、创建用户页面和路由二、表格优化1、表头自定义2、表格滚动3、加入数据索引4、利用插槽自定义显示 三、功能1、查询功能3、增加4、删除5、修改 一、创建用户页面和路由 创建用户页面 在 src/components/Main 下创建文件夹user,创建文件Us…

Java ZooKeeper-RocketMQ 面试题

Java ZooKeeper-RocketMQ 面试题 前言1、谈谈你对ZooKeeper的理解 ?2、Zookeeper的工作原理(Zab协议)3、谈谈你对分布式锁的理解,以及分布式锁的实现?4、 zookeeper 是如何保证事务的顺序一致性的?5、 zook…

设计模式之策略模式详解

目录 什么是策略模式 应用场景 业务场景实现 抽象类 实现类 Context上下文 测试类 策略模式的优缺点 什么是策略模式 他将定义的算法家族、分别封装起来,让他们之间可以相互替换,从而让算法的变化不会影响到使用算法的用户。 策略模式使用的就是…

idea出现莫名其妙错的时候

正常情况idea使用起来都很顺手,但是当项目比较多的时候,可能出现莫名奇妙的错误,比如导入的包始终报错java: 程序包com不存在,或者引入自己写的包也不存在,或者始终出现红线但是排查之后没有问题的情况,这种…

进来吧,给自己10分钟,这篇文章带你直接学会python

Python的语言特性 Python是一门具有强类型(即变量类型是强制要求的)、动态性、隐式类型(不需要做变量声明)、大小写敏感(var和VAR代表了不同的变量)以及面向对象(一切皆为对象)等特点的编程语言。 获取帮助 你可以很容易的通过Python解释器获取帮助。如果你想知道一个对象(o…

OJ:链表的中间结点

876. 链表的中间结点 - 力扣(LeetCode) 思路 思路:首先最容易想到的思路是什么呢,就是先遍历一遍链表,用一个值count来记录链表的长度,然后我们运用除法,/2,结果是几,就…

【C++干货基地】揭秘C++11常用特性:内联函数 | 范围for | auto自动识别 | nullptr指针空值

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 哈喽各位铁汁们好啊,我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发,不知道各位的…

平台工程: 用Backstage构建开发者门户 - 2

本文介绍了如何使用开源Backstage构建自己的开发者门户,并基于此实践平台工程。本系列共两篇文章,这是第二篇。原文: Platform Engineering: Building Your Developer Portal with Backstage — Part 2 在本教程第一部分中我们了解了Backstage这个用于构…

外贸网站模板建站

测绘检测wordpress外贸主题 简洁实用的wordpress外贸主题,适合做测绘检测仪器设备的外贸公司使用。 https://www.jianzhanpress.com/?p5337 白马非马衣服WordPress外贸建站模板 白马非马服装行业wordpress外贸建站模板,适用于时间服装企业的官方网站…

Git 如何上传本地的所有分支

Git 如何上传本地的所有分支 比如一个本地 git 仓库里定义了两个远程分支,一个名为 origin, 一个名为 web 现在本地有一些分支是 web 远程仓库没有的分支,如何将本地所有分支都推送到 web 这个远程仓库上呢 git push web --all

pytorch loss函数整理

变量名解释 logits:未经过normalize(未经过激活函数处理)的原始分数,例如一个mlp将特征映射到num_target_class维的输出tensor就是logits。 probs:probabilities的简写,logits经过sigmoid函数,…

Doris实战——银联商务实时数仓构建

目录 前言 一、应用场景 二、OLAP选型 三、实时数仓构建 四、实时数仓体系的建设与实践 4.1 数仓分层的合理规划 4.2 分桶分区策略的合理设置 4.3 多源数据迁移方案 4.4 全量与增量数据的同步 4.5 离线数据加工任务迁移 五、金融级数仓稳定性最佳实践 5.1 多租户资…

Jenkins的Pipeline概念

文章目录 Pipeline什么是Jenkins Pipeline声明式和脚本式Pipeline语法为何使用PipelinePipeline概念PipelineNodeStageStep Pipeline语法概述声明式Pipeline脚本式Pipeline Pipeline示例 参考 Pipeline 什么是Jenkins Pipeline Jenkins Pipeline是一套插件,它支持…

【Django】model模型—模型继承

Django中三种继承风格 抽象基类:仅将父类用于子类公共信息的载体,这样的父类永远都不会单独使用。多表继承:继承了一个模型(可能来源其它应用),且想要每个模型都有对应的数据表。代理模型:只想…