RocketMQ事务消息机制原理

news2024/9/17 7:48:16

RocketMQ工作流程

在RocketMQ当中,当消息的生产者将消息生产完成之后,并不会直接将生产好的消息直接投递给消费者,而是先将消息投递个中间的服务,通过这个服务来协调RocketMQ中生产者与消费者之间的消费速度。

那么生产者是如何投递自己的消息呢?这里向大家介绍一下RocketMQ当中的一个重要组件,topic。Topic,故名思意,主题嘛,消息生产者在生产投递消息的过程中,可以通过设定不同的topic将自身所生产的消息,投递到对应的topic当中。举一个通俗易懂的例子,我们可以把topic想象成是一个货物仓库,而topic是一个货架,对应的种类的物品要放到对应的货架上。

消费者则根据自身的需求,通过不同的topic来获取自己想要消费的消息。

RocketMQ事务消息的实现

RocketMQ事务消息的实现,其实也是非常的简单,我们只需要弄清一个原理即可,即分阶段实现。在RocketMQ当中,想要实现分阶段实现这一功能,首先要实现一个机制,就是TransactionListener--事务监听机制。事务监听机制有两个重要的方法,即executeLocalTransaction(执行本地事务),checkLocalTransaction(回查本地事务)。

RocketMQ事务消息的流转过程其实也是十分简单。首先,消息事务生产端会生生一个half消息即半消息,和正常一样,生产者也是要将这个消息投递到Broker当中,但这个Broker当中用来接收这个半消息的topic和普通的topic并不一样,我们将这种用来接收生产者生产的half消息投递的topic称为half topic。特别注意,half topic对消费者来说是不可见的,即消费者无法直接从half topic当中获取信息进行消费。

那么如何将half topic当中的消息转移到正常的topic当中,让消费者能够消费呢?

首先,当Broker当中的半topic接收到这个半消息后,Broker便会返回一个ack给生产者,生产者接收到这个ack后,便会开始执行本地事务。执行本地事务后,会产生两种结果,一种执行成功一种执行失败。

事务执行成功

当本地事务执行成功之后,生产者便会将本地事务执行成功的状态提交个Broker,当Broker接收到这个信息时,便会将半topic当中的半消息给拿出来,放到目标topic当中,供消费者能够进行正常消费。

事务执行失败

若当本地事务执行的过程中产生异常或者没有执行成功,生产者则会将事务进行回滚并会给Broker返回一个Rollback状态,当Broker接收到Rollback这个状态时,便会将半topic中的消息进行逻辑删除,并且RocketMQ还会通过异步的方式单开一个线程,用来接收这种被Broker逻辑删除的消息,并将这些消息进行清除。

事务执行成功但无状态

若本地事务执行成功,但由于网络波动,本地事务的执行状态未及时反馈给生产者或生产者迟迟未接收到本地事物的状态,即处于无状态或中间态的情况下,Broker便会启动一个定时回查任务。Broker会调用事务监听器当中的checkTransaction接口,来查看当前事务的状态,根据回查的状态结果,来进行相应的操作。这个事务回查机制,有次数限制,默认回查十五次,超过十五次后,便不会再来回查本地事务的状态了。

总结

以上便是RocketMQ中事务消息的整个流程,笔者也将流程图置于下方,希望能够给各位小伙伴带来帮助。笔者小,中,大厂均有面试经验,目前正在从事全栈开发工作,主要分享java全栈开发知识与相关的面试真题,希望能够给大家带来帮助,同大家共同进步。

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

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

相关文章

领夹麦哪个牌子音质好?直播采访十大公认音质好的麦克风!

在追求内容品质的今天,音频质量成为了衡量作品成功与否的关键指标之一。对于频繁出镜的互联网从业者、短视频创作者及直播达人而言,一款性能卓越的无线领夹麦克风无疑是提升专业形象的得力助手。它不仅轻便易携,更能在复杂环境中捕捉纯净、清…

[QT开发_音乐播放器项目笔记01]

目录 一:常用类 26 QByteArray 是 Qt 框架中的一个类,用于处理字节数组。它提供了动态大小的字节数组,可以用于存储和操作二进制数据,比如文件内容、网络数据等。 QT项目记录: 一:常用类 26 QByteArray…

capl代码写法

CAPL是一种专门用于构建通信系统测试脚本的编程语言,全称为"Communication Access Programming.Language"。 CAPL是一种类C语言的解释性脚本语言,常用于CAN和LIN总线等通信系统的开发和测试中。 CAPL提供了丰富的库函数和API,可以用…

【Spring Cloud】Sleuth +Zinkin 实现链路追踪并持久化的解决方案

文章目录 前言链路追踪介绍Sleuth入门Sleuth介绍TraceSpanAnnotation Sleuth入门1、引入依赖2、修改配置文件3、网关路由配置4、演示 Zipkin的集成ZipKin介绍ZipKin服务端安装Zipkin客户端集成1、添加依赖2、添加配置3、访问微服务4、演示 Zipkin数据持久化使用mysql实现数据持…

vue3.0学习--创建项目,基于vite创建

vite 官网地址:https://cn.vitejs.dev/guide/ 1,执行创建命令 npm create vitelatest 2, cd my3d ---- my3d 是创建的项目名字 3,npm install ---- 安装需要的插件包 4,npm run format ---- 通常用于代码格式化 5, npm…

【Docker】Docker 的背景

一、容器技术发展史 1、Jail 时代 容器不是一个新概念或者新技术,很早就有了,只是近几年遇到了云计算,整个技术被彻底引爆了。 (1)1979 年贝尔实验室发明 chroot chroot 系统调用是在 1979 年开发第 7 版 Unix 期间…

Java多重循环控制,break,continue,return

目录 1.多重循环控制 执行步骤分析 案例演示 2.跳转控制语句-break 基本介绍 基本语法 示意图 注意事项和细节说明 练习题 3.跳转控制语句-continue 基本介绍 基本语法 示意图 细节案例分析和说明 4.跳转控制语句-return 介绍 1.多重循环控制 执行步骤分析…

django基于大数据的电影推荐系统-计算机毕业设计源码71246

目 录 摘 要 1 绪论 1.1 选题背景与意义 1.2研究现状 1.3研究内容 1.4 开发环境 1.5论文结构与章节安排 2 相关理论和技术 2.1 协同过滤算法 2.2 B/S体系结构介绍 2.3 Python爬虫技术 2.4 Django框架介绍 2.5 MySQL数据库 3 电影推荐系统系统分析 3.1 可行性分析…

微信小程序审核的一些总结记录

1、文字ocr识别工具,识别ocr文字,显示出文字 这么简单的东西,说是“涉及提供图片/音频/制作、剪辑服务”,这个工具代码也就下图几行,这是哪门子的图片编辑,别管它,直接重新提交审核。 2、个人不…

营销人看巴黎奥运会,看到了什么?

不同的人眼中的巴黎奥运会是不一样的:环保人士关注奥运场馆的绿色设计,以及赛事期间对可再生能源的利用;旅游博主用镜头捕捉巴黎奥运会每一个精彩瞬间;社会学家在巴黎奥运会看到多元文化的交流与融合…… 那么营销人在巴黎奥运会…

基于IDEA+MySQL+Springboot开发的医药进销存系统

基于IDEAMySQLSpringboot开发的医药进销存系统 项目介绍💁🏻 1.创建数据库tedu_DIEMS,并导入数据库文件 2.导入项目,import-maven 3.修改application.properties的数据库IP地址、用户名和密码,改为自己的信息 4.找到Di…

嵌入式学习第11天——C语言选择结构

2024年7月29日 第11天 选择&#xff08;分支&#xff09;结构 分支结构&#xff1a;又被称为选择结构 概念 选择结构&#xff1a;根据条件成立与否&#xff0c;选择相应的操作。 条件构建 关系表达式&#xff1a;含有关系运算符的表达式&#xff08;>,<,>,<,!…

Oracle大师Roger Cornejo的推荐:使用ASH诊断Oracle解析故障

这篇文章被Oracle大师Roger Cornejo在X平台上推荐&#xff08;见下图&#xff09;&#xff0c;英文原文在&#xff1a; Diagnosing Parsing Issue with ASH 解析&#xff0c;尤其是硬解析&#xff0c;是非生产性操作&#xff0c;会消耗大量系统资源&#xff0c;导致库缓存争用…

文档数据库--MongoDB

文章目录 MongoDB介绍主要用途和特点对比关系型数据库和关系型数据库最大的不同什么时候使用MongoDBMongoDB数据结构MongoDB参考资料 MongoDB部署和访问二进制安装脚本安装MongoDB后台管理shellmongodb数据库命令mongo的helpdb.mycoll.help() mongosh的helpshow dbsuse dbnamem…

JAVA里的多线程综合练习题

练习1 package lx1;/*一共有1000张电影票,可以在两个窗口领取,假设每次领取的时间为3000毫秒, 要求:请用多线程模拟卖票过程并打印剩余电影票的数量*/ public class MyThread extends Thread {static int ticket 1000;//多个线程对象共享同一个电影票//第一种方式实现多线程&…

生成式:PolyGen: An Autoregressive Generative Model of 3D Meshes【附件】

论文:PolyGen: An Autoregressive Generative Model of 3D Meshes OBJ坐标变换: # Transpose so that z-axis is vertical.vertices = vertices[:, [2, 0, 1]]变换前: 对应数据:

springboot 微信消息推送 springboot sse推送

目录 一、springboot 微信消息推送 springboot sse推送 1、在 Spring 框架中实现 2、传统的 Servlet 中实现 一、springboot 微信消息推送 springboot sse推送 关于 SSE SSE 全程 Server Send Event&#xff0c;是 HTTP 协议中的一种&#xff0c;Content-Type 为 text/event…

MySQL存储引擎MyISAM和InnoDB

1.1MySQL存储引擎 1.1.1概述 1、什么是存储引擎 MySQL中的数据用各种不同的技术存储在文件&#xff08;或内存&#xff09;中。这些技术中的每一种都使用不同的存储机制、索引技巧、锁定水平并且提供广泛的、不同的功能和能力&#xff1b;通过选择不同的技术&#xff0c;能够…

JavaScript - 如何安装和配置Yarn包管理器

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有疑问和建议&#xff0c;请私信或评论留言&#xff01; 前言 Yarn是一个快速…

Langchain--如何使用大模型 2.0

【&#x1f34a;易编橙终身成长社群&#x1f34a;】 大家好&#xff0c;我是小森( &#xfe61;ˆoˆ&#xfe61; ) &#xff01; 易编橙终身成长社群创始团队嘉宾&#xff0c;橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官、CSDN人工智能领域优质创作者 。 Langch…