RocketMq 事务消息原理

Rocketmq 事务消息API使用

使用TransactionMQProducer类。 实现TransactionListener 接口覆盖其方法executeLocalTransaction和checkLocalTransaction 即可。

其中executeLocalTransaction 执行本地方法和checkLocalTransaction 事务状态回查。

玩法

  1. 简历一张本地事务表,字段大概有(rocketmq事务id,业务事务id),
  2. 于executeLoalTransaction,利用数据库事务特性,和业务数据同时持久化到数据库。
  3. checkLocalTransaction. 按rocketmq事务id查询数据库,是否有对应的数据。

为什么需要本地事务表

保证可靠性。当业务事务提交后节点宕机。rocketmq同样也能回查到数据。

流程分析

事务消息源码分析 

实现原理是基于二阶段提交和定时事务状态回查实现的。

二阶段提交分析

涉及相关类

Producer

TransactionMQProducer

DefaultMQProducerImpl

TransactionListener

Broker

SendMessageProcessor

EndTransactionProcessor

分析流程

  1. 入口方法TransactionMQProducer.sendMessageInTransaction 投递事务消息
  2. 调用DefaultMQProducerImpl.sendMessageInTransaction
  3. 为消息头部增加事务消息标志,发送消息。
  4. Broker 入口方法 SendMessageProcessor#sendMessage检查消息头部是否有事务标记,有投递半消息。响应Producer 结果包括事务id
  5. Producer收到消息成功发送结果后,执行本地事务。并通知Broker 本地事务执行结果。
  6. Broker 入口方法EndTransactionProcessor#processRequest 。按收到结果做决定。若是事务提交则投递普通消息,删除半消息。若是事务回滚则删除半消息。

事务消息回查

RocketMQ 通过TramsactionalMessageCheckService 线程定时去检测RMQ_SYS_TRANS_HALF_TOPIC主题中的消息,回查消息的事务状态。TransactionalMessageCheckService 的检测频率默认为1分钟,可通过broker.conf文件中设置transactionCheckInterval 来改变默认值,单位为毫秒

public class TransactionalMessageCheckService extends ServiceThread {private static final Logger log = LoggerFactory.getLogger(LoggerName.TRANSACTION_LOGGER_NAME);private BrokerController brokerController;public TransactionalMessageCheckService(BrokerController brokerController) {this.brokerController = brokerController;}//.... 省略代码@Overrideprotected void onWaitEnd() {long timeout = brokerController.getBrokerConfig().getTransactionTimeOut();int checkMax = brokerController.getBrokerConfig().getTransactionCheckMax();long begin = System.currentTimeMillis();log.info("Begin to check prepare message, begin time:{}", begin);this.brokerController.getTransactionalMessageService().check(timeout, checkMax, this.brokerController.getTransactionalMessageCheckListener());log.info("End to check prepare message, consumed time:{}", System.currentTimeMillis() - begin);}}

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

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

相关文章

51单片机定时器

51单片机定时器 1.简介 C51中的定时器和计数器是同一个硬件电路支持的,通过寄存器配置不同,就可以将他当做定时器 或者计数器使用。 确切的说,定时器和计数器区别是致使他们背后的计数存储器加1的信号不同。当配置为定时器使 用时&#xff0…

回归预测 | MATLAB实现TCN-BiGRU时间卷积双向门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现TCN-BiGRU时间卷积双向门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现TCN-BiGRU时间卷积双向门控循环单元多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 ![6 基本介绍 1.MATLAB实现TCN-BiGRU时间卷积双向门控循…

JSON格式Python,Java,PHP等封装获取淘宝商品详情描述数据API

淘宝是一个网上购物平台,售卖各类商品,包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取淘宝天猫商品详情描述数据,您可以通过开放平台的接口或者直接访问淘宝天猫商城的网页来获取商品详情详细信息。以下是两种常用方法的介绍&#…

C语言假期作业 DAY 02

题目 一、选择题 1、以下程序段的输出结果是&#xff08; &#xff09; #include<stdio.h> int main() {char s[] "\\123456\123456\t";printf("%d\n", strlen(s));return 0; } A: 12 B: 13 C: 16 D: 以上都不对 2、若有以下程序&#xff0c;则运行…

实现基于UDP简易的英汉词典

文章目录 实现目标认识相关接口socketbzerobindrecvfromsendto 实现思路和注意事项完整代码Server.hppServer.ccClient.hppClient.cc 运行效果END 实现目标 实现一个服务端和一个客户端&#xff0c;客户端负责发送一个单词&#xff0c;服务端接收到后将翻译后的结果返回发送到…

Linux下C++ STL获取Mac地址

在Ubuntu下&#xff0c;你可以使用以下代码来获取MAC地址&#xff1a; #include <iostream>using namespace std;#include <iostream> #include <fstream> #include <string>std::string getMACAddress() {std::string macAddress;std::ifstream file…

蓝桥杯2023年第十四届省赛-飞机降落

题目描述 N 架飞机准备降落到某个只有一条跑道的机场。其中第 i 架飞机在 Ti 时刻到达机场上空&#xff0c;到达时它的剩余油料还可以继续盘旋 Di 个单位时间&#xff0c;即它最早 可以于 Ti 时刻开始降落&#xff0c;最晚可以于 Ti Di 时刻开始降落。降落过程需要 Li个单位时…

Android 之 动画合集之帧动画

本节引言&#xff1a; 从本节开始我们来探究Android中的动画&#xff0c;毕竟在APP中添加上一些动画&#xff0c;会让我们的应用变得 很炫&#xff0c;比如最简单的关开Activity&#xff0c;当然自定义控件动画肯定必不可少啦~而Android中的动画 分为三大类&#xff0c;逐帧动画…

了解uuid

目录 一.认识 UUID 二.UUID 会耗尽吗 三.UUID 会重复吗 四.UUID 的版本 五.UUID的应用 六.java 如何生成UUID 一.认识 UUID uuid是经过特定的算法得到的. UUID 是 16 字节 128 位长的数字&#xff0c;通常以 36 字节的字符串表示&#xff0c;示例如下&#xff1a; 3F2…

boardmix AI:让工作效率翻倍的AI智能在线白板软件!

随着ChatGPT热度的飙升&#xff0c;AI逐步深入到各个领域&#xff0c;尤其在技术领域&#xff0c;引发了一场AI的新浪潮&#xff0c;人们谈论的焦点都与AI有关。 AI工具不仅帮助企业节约了成本&#xff0c;还极大提高了生产力。那些尚未融入AI的行业和产品&#xff0c;有着被AI…

OSI 和 TCP/IP 网络分层模型详解(基础)

OSI模型: 即开放式通信系统互联参考模型&#xff08;Open System Interconnection Reference Model&#xff09;&#xff0c;是国际标准化组织&#xff08;ISO&#xff09;提出的一个试图使各种计算机在世界范围内互连为网络的标准框架&#xff0c;简称OSI。 OSI 七层模型 OS…

Windows环境部署安装Chatglm2-6B-int4

chatglm2-6B是最近比较火爆的大模型&#xff0c;可以在消费级显卡上部署使用&#xff0c;适合学习。但是一般人也不一定有那么高的硬件配置&#xff0c;所以部署个int4版本应该是大多数人的最好选择。我就在家里部署起了int4版本的chatglm2-6B&#xff0c;记录一下免得忘了。 …

【AST抽象语法树】结构分析及特性

什么是AST? AST译名抽象语法树&#xff08;Abstract Syntax Tree&#xff09;&#xff0c;是一种用于表示源代码结构的数据结构。 它在编译器、解析器和静态代码分析等领域中被广泛使用。 AST结构分析 我们利用成熟的astexplorer来进行结构化的比较和分析。可以尝试登录以下网…

树 - 前缀树(Trie Tree)

树 - 前缀树(Trie Tree&#xff09; 什么是前缀树前缀树的实现节点数据结构定义插入方法●非递归方式●递归方式 查询单词方法●非递归方式●递归方式 查询前缀方法●非递归方式●递归方式 前缀树的复杂度前缀树有哪些应用前缀树的压缩&#xff1a;基数树双数组Trie树(DoubleAr…

Spring Security安全配置

使用Spring Boot与Spring MVC进行Web开发时&#xff0c;如果项目引入spring-boot- starter-security依赖启动器&#xff0c;MVC Security 安全管理功能就会自动生效&#xff0c;其默认的安全配置是在SecurityAutoConfiguration和UserDetailsServiceAutoConfiguration中实现的。…

探讨ChatGPT的强化学习:AI学习与交互的未来

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

Python中的正则表达式是什么,如何使用正则表达式?

正则表达式是一种强大的文本模式匹配工具&#xff0c;它提供了一种灵活的方法来查找、替换和提取文本中特定模式的内容。Python中使用内置的re模块来处理正则表达式。 下面是使用正则表达式的基本步骤&#xff1a; 导入re模块&#xff1a;在使用正则表达式之前&#xff0c;首…

ES6基础知识八:你是怎么理解ES6中Proxy的?使用场景?

一、介绍 定义&#xff1a; 用于定义基本操作的自定义行为 本质&#xff1a; 修改的是程序默认形为&#xff0c;就形同于在编程语言层面上做修改&#xff0c;属于元编程(meta programming) 元编程&#xff08;Metaprogramming&#xff0c;又译超编程&#xff0c;是指某类计算…

ChatGPT和搜索引擎哪个更好用

目录 ChatGPT和搜索引擎的概念 ChatGPT和搜索引擎的作用 ChatGPT的作用 搜索引擎的作用 ChatGPT和搜索引擎哪个更好用 总结 ChatGPT和搜索引擎的概念 ChatGPT是一种基于对话的人工智能技术&#xff0c;而搜索引擎则是一种用于在互联网上查找和检索信息的工具。它们各自具…

kaggle新赛:Bengali.AI 语音识别大赛赛题解析

赛题名称&#xff1a;Bengali.AI Speech Recognition 赛题链接&#xff1a;https://www.kaggle.com/competitions/bengaliai-speech 赛题背景 竞赛主办方 Bengali.AI 致力于加速孟加拉语&#xff08;当地称为孟加拉语&#xff09;的语言技术研究。Bengali.AI 通过社区驱动的…