【RocketMQ每日一问】rocketmq事务消息原理?

rocketmq事务消息原理?

RocketMQ的事务消息主要由三部分组成:半消息(Half Message)、执行本地事务和事务补偿机制。下面详细介绍这三部分:

  1. 半消息(Half Message)用户向RocketMQ发送半消息,这是一个预处理消息,也就是说它不会被消费者所消费。半消息主要存储在Commit Log中。
  2. 执行本地事务在用户的业务服务中执行本地事务。本地事务的执行结果可能成功或失败,根据本地事务的执行结果,用户会向RocketMQ提交事务或者回滚事务。
  3. 提交或回滚消息如果本地事务执行成功,用户会向RocketMQ提交事务,这将会使得之前的半消息变为可消费的消息;如果本地事务执行失败,那么用户可以回滚事务,这将会删除之前存储的半消息。
  4. 事务补偿机制如果在上述过程中产生了某些故障,例如网络问题或者应用崩溃导致RocketMQ没有收到事务提交或回滚指令,RocketMQ提供了一种事务检查机制。RocketMQ会定期扫描哪些处于"半消息"状态的消息,然后询问用户这些消息对应的本地事务执行结果。然后根据用户的反馈决定是提交还是回滚。

       
注:回查请求内容:   CHECK_TRANSACTION_STATE 请求码

"CHECK_TRANSACTION_STATE":这是一种命令类型,表示需要检查事务状态。
"producerGroup":生产者所在的组。
"tranStateTableOffset":事务状态表中的偏移值。
"commitLogOffset":提交日志中的偏移值。
"msgId":消息ID。


RocketMQ在事务消息的处理过程中,Broker和生产者端使用了特定的请求码进行通信。

请求码: Broker向生产者发送回查事务状态的请求时,会通过"CHECK_TRANSACTION_STATE"请求码来标识该操作。

当生产者客户端收到这个请求码后,它会进一步执行以下操作:

  1. RocketMQ客户端对每个生产者实例注册一个TransactionListener,这个监听器包含两个方法:executeLocalTransaction 和 checkLocalTransaction。前者用于执行本地事务,后者用于检查本地事务的状态。
  2. 当生产者客户端收到"CHECK_TRANSACTION_STATE"请求时,然后找到生产组,客户端会将生产组缓存起来,找到   MQProducerInner producer = this.mqClientFactory.selectProducer(group);,然后调用对应的producer中的TransactionListener中的checkLocalTransaction方法。
  3. checkLocalTransaction方法会根据业务逻辑判断事务执行结果,并返回一个枚举值:COMMIT_MESSAGE、ROLLBACK_MESSAGE或者UNKNOW。COMMIT_MESSAGE表示事务提交,ROLLBACK_MESSAGE表示事务回滚,UNKNOW表示未知状态。
  4. 客户端将这个结果响应给Broker,Broker根据响应结果更新消息的状态。

通过以上的步骤,RocketMQ可以确保消息的发送和本地事务的执行具有原子性,即要么都成功,要么都失败。

此外,RocketMQ内部通过一个CheckTransactionStateService服务线程来定期扫描消息,判断其是否需要检查。RocketMQ不会对每一条消息进行事务状态检查,只有当一条消息第一次被发出并且已经等待了一段时间(默认超过6s),RocketMQ才会触发事务状态的检查。

对于消息的发送方来说,如果收到RocketMQ的事务状态回查请求,需要重新检查本地事务的执行状态,然后再次向RocketMQ确认消息提交或回滚。

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

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

相关文章

多臂老虎机算法步骤

内容导航 类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统…

antdv中的slider组件会默认将min值传递给value

如果是使用响应式变量,会将min的值传递到v-model对应的变量里

最大化控制资源成本 - 华为OD统一考试

OD统一考试 题解: Java / Python / C++ 题目描述 公司创新实验室正在研究如何最小化资源成本,最大化资源利用率,请你设计算法帮他们解决一个任务分布问题:有taskNum项任务,每人任务有开始时间(startTime) ,结更时间(endTme) 并行度(paralelism) 三个属性,并行度是指这个…

vivado 主时钟分析

主时钟 主时钟是通过输入端口或千兆位进入设计的板时钟收发器输出引脚(例如恢复的时钟)。主时钟只能由create_clock命令定义。主时钟必须附加到网表对象。此网表对象表示中的点所有时钟边沿源自其并在时钟树上向下游传播的设计。换句话说,主…

Android Realm数据库使用

当我们的app有数据需要保存到本地缓存时,可以使用file,sharedpreferences,还有sqlite。 sharedpreferences其实使用xml的方式,以键值对形式存储基本数据类型的数据。对于有复杂筛选查询的操作,file和sharedpreference…

[Angular] 笔记 7:模块

Angular 中的模块(modules) 是代码在逻辑上的最大划分,它类似于C, C# 中的名字空间: module 可分为如下几种不同的类型: 使用模块的第一个原因是要对代码进行逻辑上的划分,第二个非常重要的原因是为了实现懒惰加载(lazy loading)&…

面试每日三题

MySQL篇 MySQL为什么使用B树索引 B树每个节点可以包含关键字和对应的指针,即B树的每个节点都会存储数据,随机访问比较友好,B树的叶子节点之间是无指针相连接的 B树所有关键字都存储在叶子节点上,非叶子节点只存储索引列和指向子…

计算机网络 应用层上 | 域名解析系统DNS 文件传输协议FTP,NFS 万维网URL HTTP HTML

文章目录 1 域名系统DNS1.1 域名vsIP?1.2 域名结构1.3 域名到IP的解析过程域名服务器类型 2 文件传送协议2.1 FTP 文件传输协议2.2 NFS 协议2.3 简单文件传送协议 TFTP 3 万维网WWW3.1 统一资源定位符URL3.2 超文本传送协议HTTP3.2.1 HTTP工作流程3.2.2 HTTP报文结构…

真实进行软件测试面试中,自动化测试面试到底会问那些?

作者:川石信息 链接:https://www.zhihu.com/question/342170872/answer/813076226 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 自动化测试面试1: 1、使用什么测试框架做的上…

7.串口通信uart编写思路及自定义协议

前言: 串口是很重要的,有许多模块通信接口就是串口,例如gps模块,蓝牙模块,wifi模块还有一些精度比较高的陀螺仪模块等等,所以学会了串口之后,这些听起来很牛批的模块都能够用起来了。此外&#…

MySQL 8.0 InnoDB Tablespaces之File-per-table tablespaces(单独表空间)

文章目录 MySQL 8.0 InnoDB Tablespaces之File-per-table tablespaces(单独表空间)File-per-table tablespaces(单独表空间)相关变量:innodb_file_per_table使用TABLESPACE子句指定表空间变量innodb_file_per_table设置…

Git系统有哪些优势

在现在的这个软件开发领域,版本控制是一项非常重要的工作。Git作为比较流行的分布式版本控制系统,他有着独特的优势成为了很多开发者们的首选。那Git系统都有哪些优势呢,下面我以自己的理解简单的介绍一下。 分布式版本控制的优势 Git用的是…

标准地址门牌管理系统:提升地址管理效率与准确性的关键

在信息化社会的今天,地址管理的重要性日益凸显。无论是商业活动、物流配送,还是公共安全,都需要精确、高效的地址管理。然而,传统地址管理方式往往存在地址不规范、信息不全等问题,这无疑增加了管理难度和工作量。为此…

linux 中 C++的环境搭建以及测试工具的简单介绍

文章目录 makefleCMakegdb调试 与 coredumpValgrind 内存检测gtest 单元测试 makefile 介绍 安装 : sudo apt install make makefile 的规则: 举例说明 包括:目标文件 、 依赖文件 、 生成规则 使用 : make make clean CMake : CMake是一个…

046.Python包和模块_导入相关

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉&…

『番外篇五』SwiftUI 进阶之如何动态获取任意视图的 tag 和 id 值

概览 在某些场景下,我们需要用代码动态去探查 SwiftUI 视图的信息。比如任意视图的 id 或 tag 值: 如上图所示:我们通过动态探查技术在运行时将 SwiftUI 特定视图的 tag 和 id 值显示在了屏幕上。 这是如何做到的呢? 在本篇博文,您将学到如下内容: 概览1. “如意如意,…

手敲MyBatis(十三章)-返回Insert操作自增索引值

1.目的 这一章的目的主要是插入语句以后返回插入记录的id,因为插入语句可分为要返回记录id,不要返回记录id的以及不同数据源类型执行的时机也不同(如:oracle不支持主键,需要先插入序列再增加,Mysql支持主键…

SQL指南:掌握日期函数来查询和管理数据

文章目录 1. 引言2. 建立数据库表2.1 建表语句2.2 数据插入 查询案例3.1 查询当前日期的订单3.2 查询过去一周内的订单3.3 查询明天的日期3.4 查询今年的订单3.5 查询特定月份的订单 总结 1. 引言 在数据库管理中,处理日期和时间是一项基本但重要的任务。本指南将通…

数智金融技术峰会|数新网络受邀分享《金融信创湖仓一体数据平台架构实践》,敬请期待

12月23日,数新网络参加DataFunSummit 2023:数智金融技术峰会。会上,数新CTO原攀峰将为大家带来《金融信创湖仓一体数据平台架构实践》 主题分享。 本次峰会由DataFun联合火山引擎、蓝驰等知名企业举办,将共同为大家带来一场数智金…

玩转Instagram Shop只需要学会这些功能

Instagram Shop作为Instagram下属的电商购物平台。用户可以通过浏览Instagram上的推荐产品和品牌,在无需离开应用的情况下了解并购买新的商品。对于经常使用Instagram的用户来说是个很便捷的购物渠道。面对这个新渠道,我们又该如何玩转它呢。这篇文章就会…