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

2023-12-22 21:28

本文主要是介绍【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确认消息提交或回滚。

这篇关于【RocketMQ每日一问】rocketmq事务消息原理?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/525535

相关文章

Spring中事务的传播机制

一、前言 首先事务传播机制解决了什么问题 Spring 事务传播机制是包含多个事务的方法在相互调用时,事务是如何在这些方法间传播的。 事务的传播级别有 7 个,支持当前事务的:REQUIRED、SUPPORTS、MANDATORY; 不支持当前事务的:REQUIRES_NEW、NOT_SUPPORTED、NEVER,以及嵌套事务 NESTED,其中 REQUIRED 是默认的事务传播级别。

数据库原理与安全复习笔记(未完待续)

1 概念 产生与发展:人工管理阶段 → \to → 文件系统阶段 → \to → 数据库系统阶段。 数据库系统特点:数据的管理者(DBMS);数据结构化;数据共享性高,冗余度低,易于扩充;数据独立性高。DBMS 对数据的控制功能:数据的安全性保护;数据的完整性检查;并发控制;数据库恢复。 数据库技术研究领域:数据库管理系统软件的研发;数据库设计;数据库理论。数据模型要素 数据结构:描述数据库

计算机组成原理——RECORD

第一章 概论 1.固件  将部分操作系统固化——即把软件永恒存于只读存储器中。 2.多级层次结构的计算机系统 3.冯*诺依曼计算机的特点 4.现代计算机的组成:CPU、I/O设备、主存储器(MM) 5.细化的计算机组成框图 6.指令操作的三个阶段:取指、分析、执行 第二章 计算机的发展 1.第一台由电子管组成的电子数字积分和计算机(ENIAC) 第三章 系统总线

GaussDB关键技术原理:高性能(二)

GaussDB关键技术原理:高性能(一)从数据库性能优化系统概述对GaussDB的高性能技术进行了解读,本篇将从查询处理综述方面继续分享GaussDB的高性能技术的精彩内容。 2 查询处理综述 内容概要:本章节介绍查询端到端处理的执行流程,首先让读者对查询在数据库内部如何执行有一个初步的认识,充分理解查询处理各阶段主要瓶颈点以及对应的解决方案,本章以GaussDB为例讲解查询执行的几个主要阶段

消息认证码解析

1. 什么是消息认证码         消息认证码(Message Authentication Code)是一种确认完整性并进行认证的技术,取三个单词的首字母,简称为MAC。         消息认证码的输入包括任意长度的消息和一个发送者与接收者之间共享的密钥,它可以输出固定长度的数据,这个数据称为MAC值。         根据任意长度的消息输出固定长度的数据,这一点和单向散列函数很类似

每日一练:攻防世界:5-1 MulTzor

一、XorTool 基于 XOR(异或)运算实现。它可以帮助您快速地对文本、二进制文件进行加密解密操作。 认识XorTool工具: 让我们先去认识一下工具: xortool.py 是基于 python 的脚本,用于完成一些 xor 分析,包括: 猜想 key 的长度 猜想 key 的值 解密一些经过 xoe 加密的文件 也就是说当遇到不知道文件类型的文件,可以尝试去看看它是否被xo

【计算机组成原理】部分题目汇总

计算机组成原理 部分题目汇总 一. 简答题 RISC和CICS 简要说明,比较异同 RISC(精简指令集)注重简单快速的指令执行,使用少量通用寄存器,固定长度指令,优化硬件性能,依赖软件(如编译器)来提升效率。 CISC(复杂指令集)包含多样复杂的指令,能一条指令完成多步操作,采用变长指令,减少指令数但可能增加执行时间,倾向于硬件直接支持复杂功能减轻软件负担。 两者均追求高性能,但RISC

MySQL数据库锁的实现原理

MySQL数据库的锁实现原理主要涉及到如何确保在多用户并发访问数据库时,保证数据的完整性和一致性。以下是MySQL数据库锁实现原理的详细解释: 锁的基本概念和目的 锁的概念:在数据库中,锁是用于管理对公共资源的并发控制的机制。当多个用户或事务试图同时访问或修改同一数据时,数据库系统通过加锁来确保数据的一致性和完整性。 锁的目的:解决多用户环境下保证数据库完整性和一致性的问题。在并发的情况下,会

线性回归(Linear Regression)原理详解及Python代码示例

一、线性回归原理详解         线性回归是一种基本的统计方法,用于预测因变量(目标变量)与一个或多个自变量(特征变量)之间的线性关系。线性回归模型通过拟合一条直线(在多变量情况下是一条超平面)来最小化预测值与真实值之间的误差。 1. 线性回归模型         对于单变量线性回归,模型的表达式为:         其中: y是目标变量。x是特征变量。β0是截距项(偏置)。β1

标准分幅下的图幅号转换成经纬度坐标【原理+源代码】

最近要批量的把标准分幅下的图幅号转换成经纬度坐标,所以这两天写了个程序来搞定这件事情。 先举个例子说明一下这个程序的作用。 例如:计算出图幅号I50G021040的经纬度范围,即最大经度、最小经度、最大纬度、最小纬度。 运用我编写的这个程序,可以直接算出来,这个图幅号的经纬度范围,最大经度为115.3125°,最小经度为115.25°,最大纬度为31.167°,最小纬度为31.125°。