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

前言

上一节给大家讲了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

联系方式

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探讨前端技术的未来:创新与适应的必要性

一、引言 2023年,IT圈似乎被一种悲观的论调所笼罩,那就是“Java 已死、前端已凉”。然而,真相是否如此呢?本文将围绕这一主题,探讨前端的现状和未来发展趋势。 二、为什么会出现“前端已死”的言论 这一言论的出现并…

蓝凌EIS智慧协同平台 SQL注入漏洞复现

0x01 产品简介 蓝凌EIS智慧协同平台是一款专为企业提供高效协同办公和团队合作的产品。该平台集成了各种协同工具和功能,旨在提升企业内部沟通、协作和信息共享的效率。 0x02 漏洞概述 由于蓝凌EIS智慧协同平台 UniformEntry.asp接口处未对用户输入的SQL语句进行…

volatile 关键字的作用(变量可见性、禁止重排序)

volatile 关键字的作用(变量可见性、禁止重排序) Java 语言提供了一种稍弱的同步机制,即 volatile 变量,用来确保将变量的更新操作通知到其他线程。volatile 变量具备两种特性,volatile 变量不会被缓存在寄存器或者对…

python和pygame实现捉小兔游戏

python和pygame实现捉小兔游戏 python和pygame实现捉小兔游戏,需要安装使用第三方库pygame,关于Python中pygame游戏模块的安装使用可见 https://blog.csdn.net/cnds123/article/details/119514520 下面是使用Python和Pygame创建的游戏,其中有…

仿淘宝、京东首页icons横向滑动效果

一、效果展示 淘宝&#xff1a; 京东&#xff1a; 二、话不多说&#xff0c;直接上demo 案例效果 代码 <template><div class"demo-page"><h1>滚动效果</h1><div classicons-slide-wrapper><div class"icons-container&quo…

【Java代码审计】SQL注入篇

【Java代码审计】SQL注入篇 1.Java执行SQL语句的几种方式2.Java SQL注入SQL语句参数直接动态拼接预编译依然采用拼接order by注入%和_模糊查询MyBatis中使用存在风险的语法 3.Java常规注入代码审计思路4.二次注入代码审计 1.Java执行SQL语句的几种方式 1、JDBC Statement执行S…

java综合实验-图书管理系统

二、实验项目内容&#xff08;实验题目&#xff09; 1. 使用Java编程语言进行实验。 2. 采用面向对象的思想进行系统设计。 3. 实现基本的图书管理功能&#xff0c;包括添加图书、删除图书、查询图书信息等。 4. 要求有良好的用户交互界面。 步骤参考&#xff1a; 步骤一…

ChatGPT使用:一个发包机器人的提示词

发包机器人&#xff1a; 设想&#xff1a;目前项目组有n条打包线会输出多个包&#xff0c;用户想获取最新的包是比较困难的&#xff0c;难点在于 1. 分支多&#xff1a;trunk&#xff0c;release&#xff0c;outer等&#xff0c;至少有3个分支&#xff1b; 2. 多平台&#x…

数据分析的基本步骤

了解过数据分析的概念之后&#xff0c;我们再来说下数据分析的常规步骤。 明确目标 首先我们要确定一个目标&#xff0c;即我们要从数据中得到什么。比如我们要看某个指标A随时间的变化趋势&#xff0c;以期进行简单的预测。 数据收集 当确定了目标之后&#xff0c;就有了取…

音乐制作软件Ableton Live 11 mac功能特点

Ableton Live 11 mac是一款数字音频工作站软件&#xff0c;用于音乐制作、录音、混音和现场演出是一款流行的音乐制作软件。 Ableton Live 11 mac特点和功能 Comping功能&#xff1a;Live 11增加了Comping功能&#xff0c;允许用户在不同的录音轨道上进行多次录音&#xff0c;…

前端离开后端就不能开发项目了吗?

前端离开后端就不能开发项目了吗&#xff1f; 经常在技术社区中看到后端个个都能代替前端&#xff0c;前端却代替不了后端&#xff01; 后端有多牛&#xff0c;前端有多菜&#xff01;嗯.......事实真的如此吗&#xff1f;前端一个人在没有服务器、数据库的情况下到底能不能开发…

怎么把图片转文字?这几个图片转文字方法一定要知道!

怎么把图片转文字&#xff1f;无论是从书籍、网络还是社交媒体上&#xff0c;我们经常需要从图片中提取文字来进行复制、编辑或翻译。手动操作耗时耗力&#xff0c;效率低下&#xff0c;那么怎么把图片转文字呢&#xff1f;今天我将介绍三种不同的方法来实现图片转文字。 图片转…

Python之time模块详解

python3中time模块的用法及说明 python中&#xff0c;导入time模块使用的命令是 import time 可以使用以下命令查看time模块内置的能够使用的方法&#xff1a; dir(time) 可以使用以下命令查看time模块中每个内置方法的说明&#xff1a; help(time.time_method) 比如time模块下…

elementui + vue2实现表格行的上下移动

场景&#xff1a; 如上&#xff0c;要实现表格行的上下移动 实现&#xff1a; <el-dialogappend-to-bodytitle"条件编辑":visible.sync"dialogVisible"width"60%"><el-table :data"data1" border style"width: 100%&q…

Python之random模块详解

python的random模块 random模块是python中一个生成随机数的模块。 random不是python解释器内置的模块。 导入random模块的方法是&#xff1a; import random 如果只使用random模块中的单个方法的话&#xff0c;也可以使用 from random import method_name 例如&#xff1a; …

中医处方软件西医电子处方系统,一键生成处方单可设置配方模板教程

一、前言 有的诊所是中医和西医都有&#xff0c;医师是全科医师&#xff0c;那么所使用的软件既要能开中药处方也要能开西药处方&#xff0c;而且可以通过一键生成配方&#xff0c;则可以节省很多时间。 下面就以 佳易王诊所卫生室电子处方为例说明 如上图&#xff0c;如果是…

Python Pandas 如何给DataFrame增加一行/多行 数据(第6讲)

Python Pandas 如何给DataFrame增加一行/多行 数据(第6讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ…

【Linux】进程周边004之进程的调度与切换(领略Linux系统进程调度算法的神奇)

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.进程切换 2.进程调度 2.…

十四 动手学深度学习v2计算机视觉 ——转置矩阵

文章目录 基本操作填充、步幅和多通道再谈转置卷积不填充&#xff0c;步幅为1填充为p&#xff0c;步幅为1填充为p&#xff0c;步幅为s 基本操作 填充、步幅和多通道 填充&#xff1a; 与常规卷积不同&#xff0c;在转置卷积中&#xff0c;填充被应用于的输出&#xff08;常规卷…

ospf 知识总结

ospf 知识总结 一、ospf的概念 - 开放式最短路径优先协议&#xff0c;是广泛使用的一种动态路由协议&#xff0c;它属于链路状态路由协议&#xff0c;是一个内部网关协议&#xff08;IGP&#xff09;&#xff0c;用于在单一自治系统&#xff08;AS&#xff09;内决策路由。 - …