Java小案例-RocketMQ的11种消息类型,你知道几种?(事务消息)

news2024/9/23 9:31:42

前言

上一节给大家讲了Rocket的延迟消息,这一节和大家聊一下事务消息,关于延迟消息大家可以点下面这个链接直接看。

事务消息

事务消息是RocketMQ提供的一种类似X/Open XA的分布式事务功能。通过RocketMQ的事务消息,可以达到分布式事务的最终一致。

事务消息用起来也比较简单,如下所示:

public class TransactionMessageDemo {

    public static void main(String[] args) throws Exception {
        TransactionMQProducer transactionMQProducer = new TransactionMQProducer("sanyouProducer");
        transactionMQProducer.setNamesrvAddr("192.168.200.143:9876");

        //设置事务监听器
        transactionMQProducer.setTransactionListener(new TransactionListener() {

            @Override
            public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
                //处理本次事务
                return LocalTransactionState.COMMIT_MESSAGE;
            }

            @Override
            public LocalTransactionState checkLocalTransaction(MessageExt msg) {
                //检查本地事务
                return LocalTransactionState.COMMIT_MESSAGE;
            }
        });

        transactionMQProducer.start();

        Message message = new Message("sanyouTopic", "java日记".getBytes());

        //发送消息
        transactionMQProducer.sendMessageInTransaction(message, new Object());
    }

}

事务消息发送相对于前面的例子主要有以下不同:

  • 将前面的DefaultMQProducer换成TransactionMQProducer

  • 需要设置事务的监听器TransactionListener,来执行本地事务

  • 发送方法改成 sendMessageInTransaction

为什么要这么改,接下来我们来讲讲背后的实现原理

上一节在说延迟消息的时候提到,RocketMQ使用到了SCHEDULE_TOPIC_XXXX这个中转Topic,来偷梁换柱实现延迟消息

不仅仅是延迟消息,事务消息其实也是这么干的,它也会进行偷梁换柱,将消息先存在RMQ_SYS_TRANS_HALF_TOPIC这个Topic下,同时也会将消息真正的Topic和队列id存到额外信息中,操作都是一样滴

由于消息不在真正目标的Topic下,所以这条消息消费者也是消费不到滴

当消息成功存储之后,服务端会向生产者响应,告诉生产者我消息存储成功了,你可以执行本地事务了

之后生产者就会执行本地执行事务,也就是执行如下方法

TransactionListener#executeLocalTransaction

当本地事务执行完之后,会将执行的结果发送给服务端

服务端会根据事务的执行状态来执行对应的处理结果

  • commit:提交事务消息,跟延迟消息一样,重新构建一条消息,Topic和队列id都设置成消息真正的Topic和队列id,然后重新存到CommitLog文件,这样消费者就可以消费到消息了

  • rollback:回滚消息,其实并没有实际的操作,因为消息本身就不在真正的Topic下,所以消费者压根就消费不到,什么都不做就可以了

  • unknown:本地事务执行异常时就是这个状态,这个状态下会干一些事,咱们后面再说

所以在正常情况下,事务消息整个运行流程如下图所示

既然有正常情况下,那么就有非正常情况下

比如前面提到的抛异常导致unknown,又或者什么乱七八糟的原因,导致无法正常提交本地事务的执行状态,那么此时该怎么办呢?

RocketMQ当然也想到了,他有自己的一套补偿机制

RocketMQ内部会起动一个线程,默认每隔1分钟去检查没有被commit或者rollback的事务消息

RocketMQ内部有一套机制,可以找出哪些事务消息没有commit或者rollback,这里就不细说了

当发现这条消息超过6s没有提交事务状态,那么此时就会向生产者发送一个请求,让生产者去检查一下本地的事务执行的状态,就是执行下面这行代码

TransactionListener#checkLocalTransaction

之后会将这个方法返回的事务状态提交给服务端,服务端就可以知道事务的执行状态了

这里有一个细节需要注意,事务消息检查次数不是无限的,默认最大为15次,一旦超过15次,那么就不会再被检查了,而是会直接把这个消息存到TRANS_CHECK_MAX_TIME_TOPIC

所以你可以从这个Topic读取那些无法正常提交事务的消息

这就是RocketMQ事务消息的原理

总结

RocketMQ事务消息的实现主要是先将消息存到RMQ_SYS_TRANS_HALF_TOPIC这个中间Topic,有些资料会把这个消息称为半消息(half消息),这是因为这个消息不能被消费

之后会执行本地的事务,提交本地事务的执行状态

RocketMQ会根据事务的执行状态去判断commit或者是rollback消息,也就是是不是可以让消费者消费这条消息的意思

在一些异常情况下,生产者无法及时正确提交事务执行状态

RocketMQ会向生产者发送消息,让生产者去检查本地的事务,之后再提交事务状态

当然,这个检查次数默认不超过15次,如果超过15次还未成功提交事务状态,RocketMQ就会直接把这个消息存到TRANS_CHECK_MAX_TIME_TOPIC

联系方式

关于文章中大家有任何疑问可以通过关注公众号《编程乐学》进行留言,同时,公众号还有更多有趣的项目以及关于学习编程的笔记资料大家可以看看,欢迎大家进行留言。

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

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

相关文章

什么是数据可视化?数据可视化的优势、方法及示例

前言 在当今的数字时代,数据是企业和组织的命脉,生成的数据量呈指数级增长。这种被称为大数据的海量数据在洞察力和决策方面具有巨大的潜力。然而,如果没有一种有效的方法来分析和理解这些数据,它就会变得毫无意义和难以管理。这就…

SaaS 电商设计 (五) 私有化部署-实现 binlog 中间件适配

一、 背景 具体的中间件私有化背景在上文 SaaS 电商设计 (二) 私有化部署-缓存中间件适配 已有做相关介绍.这里具体讨论的场景是通过解析mysql binlog 来实现mysql到其他数据源的同步.具体比如:在电商的解决方案业务流中经常有 ES 的使用场景,用以解决一些复杂的查询和搜索商品…

GD32F4标准外设库

学习目标 了解标准库来源熟悉模板搭建流程掌握在已有模板基础下进行开发学习内容 标准外设库获取 标准固件库获取我们可以从官网进行下载。 下载链接:兆易创新GigaDevice-资料下载兆易创新GD32 MCU 找到 GD32F4xx Firmware Library 这个压缩包 下载完成后,进行解压,解压…

Java医院信息化建设云HIS系统源码

云HIS提供标准化、信息化、可共享的医疗信息管理系统,实现医患事务管理和临床诊疗管理等标准医疗管理信息系统的功能。优化就医、管理流程,提升患者满意度、基层首诊率,通过信息共享、辅助诊疗等手段,提高基层医生的服务能力构建和…

nginx 1.24.0 安装nginx最新稳定版

1.官网: nginx: download 2. 选择稳定版: 3. 可以下载,然后上传服务器,也可以wget获取: cd /home wget https://nginx.p2hp.com/download/nginx-1.24.0.tar.gz 4. 放入/home 下。并解压缩,重命名nginx;…

C之不小心就犯错误1

以为会打印: it is ok 然而并不是: 原因: 根据C语言隐式类型转换的原理,如果是int型与uint型进行比较(其它类型同理),则会将int型数据转换为uint型,则-1变成了 2^32-1 429496729…

Window操作系统发展史

引言 当谈及计算机操作系统的丰富历史和多样性时,Windows操作系统无疑是其中的一颗璀璨明星。自1985年首次亮相以来,Windows经历了长足的发展,塑造了计算机使用体验的方方面面。从初始的简单图形用户界面到如今强大而多样的功能&…

服务器被攻击宕机的一些小建议

现在网络攻击屡有发生,任何网站服务器都面临这样的危险,服务器被攻击造成的崩溃宕机是损失是我们无法估量的。网络攻击我们无法预测,但做好防御措施是必须的,建议所有的网站都要做好防范措施,准备相应的防护预案&#…

“Java 已死、前端已凉”?技术变革与编程语言前景:Java和前端的探讨

前端已死话题概论 本文讨论了近期IT圈中流传的“Java 已死、前端已凉”言论。我们审视了这些言论的真实性,并深入探讨了技术行业的演变和新兴技术的出现对编程语言和前端开发的影响。通过分析历史发展、当前趋势和未来展望,我们提供了对这些话题更深层次…

改造哈希表,封装unordered_map和unordered_set

正文开始前给大家推荐个网站,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 unordered_map是存的是pair是K,V型的,而unordered_set是K型的&#xff…

恒创:更换服务器,网站备案会掉吗

随着互联网的普及,越来越多的企业和个人选择通过网站来展示自己的形象和业务。然而,在网站建设和运营过程中,更换服务器是一个常见的问题。那么,更换服务器后,网站备案是否会受到影响呢? 网站备案是为了保…

docker-compose 升级;yaml文件编写;gpu使用

1、docker-compose 升级(现在已经2.*版本,升级使支持gpu) 参考:https://blog.csdn.net/weixin_51311218/article/details/131376823 https://github.com/docker/compose/issues/8142 1)下载:原来1.18&…

11、ble_mesh_provisioner 配网器

1、初始化流程,存储初始化,nvs擦除, 2、bluetooth_init();ble协议栈初始化 3、ble_mesh_get_dev_uuid(dev_uuid);//获取设备uuid加载到mac. 4、ble_mesh_init();//ble mesh协议栈初始化 4.1配置网络钥匙,索引,赋…

微信视频号视频加密逆向

tl;dr 拿WxIsaac64(Isaac64的变种?)生成2^17个字节。然后和视频的前2^17字节做异或。 前言 略去, 总之就是WeChatVideoDownloader不能用了。 原文链接: here 准备工作 在正式开始逆向之前,我们首先需要能够在微信视频号中打开开发者工具,由于微信…

vue3+echarts 立体柱状效果

vue3echarts 立体柱状效果 废话不多说&#xff0c;直接上代码 就两步&#xff0c;直接复制粘贴一手 <div id"main" class"chart" ref"chartDom"></div>import * as echarts from echarts; type EChartsOption echarts.EChartsOpti…

c YUV 转 JPEG(准备霍夫曼编码)

先取yuv 文件中一个168的块&#xff0c;跑通全流程 理解与思路&#xff1a; 1.块分割 YUV 文件分为&#xff1a;YUV444 YUV 422 YUV420。444:就是&#xff1a;12个char 有4个Y&#xff0c;4个U&#xff0c;4个 U&#xff0c;422&#xff1a;8个char 中有4个Y &#x…

网络渗透测试(1)

实验1&#xff1a;用搜索引擎Google或百度搜索麻省理工学院网站中文件名包含“network security”的pdf文档&#xff0c;截图搜索得到的页面。 实验2&#xff1a;brassserie&#xff08;题目中给到的餐厅名称&#xff09; 实验3 实验4&#xff1a;将Z29vZCBnb29kIHN0dWR5IQ解…

攻防世界题目练习——Web引导模式(五)(持续更新)

题目目录 1. FlatScience2. bug3. Confusion1 1. FlatScience 参考博客&#xff1a; 攻防世界web进阶区FlatScience详解 题目点进去如图&#xff0c;点击链接只能看到一些论文pdf 用dirsearch和御剑扫描出一些隐藏文件&#xff1a; robots.txt: admin.php: login.php: f…

《人工智能导论》知识思维导图梳理【第7章节】

文章目录 说明专家系统机器学习机器学习定义工作流程模型评估机器学习分类在这里插入图片描述 机器学习部分md内容机器学习1 机器学习定义机器学习是从数据中自动分析获得模型&#xff0c;并利用模型对未知数据进行预测机器学习&#xff08;machine learning&#xff09;使计算…

美容店预约小程序搭建指南

随着互联网的发展&#xff0c;越来越多的传统行业开始尝试将业务与互联网相结合&#xff0c;以提供更加便捷、高效的服务。美容行业也不例外。本文将通过使用第三方制作平台&#xff0c;如乔拓云网&#xff0c;指导您如何搭建一个美观实用的美容店预约小程序&#xff0c;帮助您…