RocketMQ的事务消息和改造

news2025/8/3 8:54:53

什么是 rmq分布式事务消息?

Apache RocketMQ在4.3.0版中已经支持分布式事务消息,这里RocketMQ采用了2PC的思想来实现了提交事务消息,同时增加一个补偿逻辑来处理二阶段超时或者失败的消息,如下图所示。

 

事务消息解决什么问题?

本地事务与消息发送的原子性问题。

简单解释:本地事务提交,消息肯定发出去;本地事务回滚,消息肯定不能发出去。

目前事务消息现状

chd 基于 rmq 提供的事务消息方案,通过本地事务记录表,简化事务消息开发,封装了上图第6步,提供通用回查的逻辑。

以下单流程为例,简述目前 chd 开发者使用事务消息流程:

 

 

以下代码示例当前事务消息开发使用过程:

 

基于现状,目前使用 rmq 官方提供二阶段事务消息存在以下痛点。

痛点一: 开发理解、使用成本高。

如果不理解 rmq 2pc 事务消息,业务中很难用对、用好。例如忘记很重要的一步 判断事务执行结果

痛点二:rmq事务消息使用时,事务开始前就得构造好业务消息体,但很多情况下只有事务内执行时才能获取到消息体内容

这种场景根本没法使用,或业务代码改造成本很高,例如改造为两个事件并使用中间数据关联。

痛点三:本地事务内发送 rmq 非事务消息,出现本地事务还没提交消息都发出去被错误消费,导致误以为丢消息

如果日志不完善,排查业务问题难度大。这种情况会出现要么被错误消费(事务没提交,查到数据是老的),要么误认为丢消息(消费时回查没数据直接忽略)

其他痛点待整理

因此,分析以上问题,需要提供业务代码侵入低、使用成本低,并能解决以上痛点的本地事务消息表方案

本地事务消息表最终一致性方案

改造思路:

1. 本地存储事务消息内容,和业务流程事务一起成功一起失败
2. 监听事务管理器提交事务的动作,事务提交后再去执行实时发消息
3. 假设事物提交后实时发送消息失败,要有补偿机制确保消息最终能发出去

以下单流程为例,简述实现过程:

 

 

开发者使用方式示例

 

其他内容待整理

SQL备注

ALTER TABLE `xi_local_transaction_log` ADD COLUMN `sendStatus` tinyint UNSIGNED NOT NULL DEFAULT '0' COMMENT '发送状态', ADD COLUMN `payload` text COMMENT '消息载体,json';
ALTER TABLE `order_local_transaction_log` ADD COLUMN `sendStatus` tinyint UNSIGNED NOT NULL DEFAULT '0' COMMENT '发送状态', ADD COLUMN `payload` text COMMENT '消息载体,json';
ALTER TABLE `vaccine_local_transaction_log` ADD COLUMN `sendStatus` tinyint UNSIGNED NOT NULL DEFAULT '0' COMMENT '发送状态', ADD COLUMN `payload` text COMMENT '消息载体,json';

ALTER TABLE `activity_local_transaction_log` ADD COLUMN `sendStatus` tinyint UNSIGNED NOT NULL DEFAULT '0' COMMENT '发送状态', ADD COLUMN `payload` text COMMENT '消息载体,json';
ALTER TABLE `user_local_transaction_log` ADD COLUMN `sendStatus` tinyint UNSIGNED NOT NULL DEFAULT '0' COMMENT '发送状态', ADD COLUMN `payload` text COMMENT '消息载体,json';
ALTER TABLE `commodity_local_transaction_log` ADD COLUMN `sendStatus` tinyint UNSIGNED NOT NULL DEFAULT '0' COMMENT '发送状态', ADD COLUMN `payload` text COMMENT '消息载体,json';
ALTER TABLE `knowledge_local_transaction_log` ADD COLUMN `sendStatus` tinyint UNSIGNED NOT NULL DEFAULT '0' COMMENT '发送状态', ADD COLUMN `payload` text COMMENT '消息载体,json';
ALTER TABLE `credit_local_transaction_log` ADD COLUMN `sendStatus` tinyint UNSIGNED NOT NULL DEFAULT '0' COMMENT '发送状态', ADD COLUMN `payload` text COMMENT '消息载体,json';
ALTER TABLE `distribution_local_transaction_log` ADD COLUMN `sendStatus` tinyint UNSIGNED NOT NULL DEFAULT '0' COMMENT '发送状态', ADD COLUMN `payload` text COMMENT '消息载体,json';

CREATE TABLE `commodity_local_transaction_log` (
  `id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '全局id',
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `modifyTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `transactionId` varchar(32) NOT NULL DEFAULT '' COMMENT '事务ID',
  `topic` varchar(64) NOT NULL DEFAULT '' COMMENT 'topic名称',
  `tag` varchar(64) NOT NULL DEFAULT '' COMMENT 'tag名称',
  `sendStatus` tinyint UNSIGNED NOT NULL DEFAULT '0' COMMENT '发送状态',
  `payload` text COMMENT '消息载体,json',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uniq_transactionId` (`transactionId`)
) DEFAULT CHARSET=utf8mb4 COMMENT='MQ事务消息记录表';

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

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

相关文章

Java学习笔记 --- 多线程

一、线程相关概念 程序 程序是为完成特定任务,用某种语言编写的一组指令的集合。简单的说就是我们写的代码 进程 1、进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存空间。当我们使用迅雷&…

程序控制结构

程序控制结构程序流程控制介绍顺序控制分支控制if-else单分支案例:编写一个程序,可以输入人的年龄,如果该同志的年龄大于等于 18 岁, 则输出 "你年龄大于 18,要对自己的行为负责,送入监狱"。双分支案例:编写一个程序&am…

关于Python函数的几点说明

关于Python函数的几点说明 本文介绍Python函数返回值、调用函数加括号和不加括号有什么区别、冒号后面省略号(...)和 pass等说明。 一、为什么函数意外返回“None” 初学者可能遇到这种情况,定义的函数意外返回“None”,例如&a…

Qt error: fatal error: Killed signal terminated program cc1plus

Qt error: fatal error: Killed signal terminated program cc1plus 文章目录Qt error: fatal error: Killed signal terminated program cc1plus摘要1 出现问题原因2 解决方法虚拟机物理机增加SWAP交换空间关键字: qt、 fatal、 error、 cc1plus、 Killed signal …

K8S实战 - 如何在kubernetes中安装软件

如何在kubernetes中安装软件 1、编写脚本安装 通过编写yaml文件,执行kubectl apply -f 可以安装软件 编写yaml的时候注意事项: pod的类型(deployment、statefulset等)端口的定义(service)配置文件的定义…

艾美捷Cholesterol胆固醇功效和参数说明

胆固醇又称胆甾醇。一种环戊烷多氢菲的衍生物。其溶解性与脂肪类似,不溶于水,易溶于乙-醚、氯-仿等溶剂。胆固醇是动物组织细胞所不可缺少的重要物质,它不仅参与形成细胞膜,而且是合成胆汁酸,维生素D以及甾体激素的原料…

[附源码]计算机毕业设计JAVA公益劳动招募管理系统

[附源码]计算机毕业设计JAVA公益劳动招募管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM my…

漏洞深度分析|Apache MINA SSHD反序列化漏洞

项目介绍 Apache MINA SSHD 是一个 100% 纯 java 库,支持客户端和服务器端的 SSH 协议。它的目的不是要替代 Unix 操作系统中的 SSH 客户端或 SSH 服务器,而是为需要 SSH 支持的基于 Java 的应用程序提供支持。 该库可以利用多个 I/O 后端: …

最小二乘法在ISP CCM标定中的简介

一、基础知识 假设我们有16幅名人脸部灰度图像,我们是否可以找到16幅脸部图像的线性组合,使得其线性组合最接近于目标脸部图像呢? 名人库我们知道灰度图像可以用矩阵表示。假设有如下灰度图。 我们可以用矩阵表示为: 我们也可以用…

Python机器学习16——相关向量机(RVM)

本系列基本不讲数学原理,只从代码角度去让读者们利用最简洁的Python代码实现机器学习方法。 背景介绍 学机器学习的应该都知道支持向量机(SVM),这个方法在深度学习兴起之前算是很热门的分类方法,在机器学习里面&#…

Go: 通过Fiber构建微服务

文章目录简介1. 微服务2. Fiber?Fiber集成及使用1.安装fiber2. 简单使用3.简单实例小结简介 1. 微服务 微服务或微服务架构是一种体系结构风格,可以将应用程序构建成一个服务的集合: Maintainable 可维修Testable 可测试的Loosely coupled…

毫米波雷达基础知识系列——FFT

毫米波雷达基础知识系列——FFT及DSP优化实现FFT来源FFT为什么快FFT的种类基2FFT推导FFT来源 FFT来源于DFT离散傅里叶变换,DFT的计算公式为: X(k)∑n0N−1x(n)WNknX(k) \sum_{n0}^{N-1} x(n)W_{N}^{kn} X(k)n0∑N−1​x(n)WNkn​ 为什么不直接用DFT计算…

【 java 常用类】日期相关 API 操作

📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜📝 个人主页:馆主阿牛🔥🎉 支持我:点赞👍收藏⭐️留言&#x1f4d…

ZYNQ之FPGA学习----MMCM/PLL IP核使用实验

1 MMCM/PLL IP核介绍 PLL 的英文全称是 Phase Locked Loop,即锁相环,是一种反馈控制电路。PLL 对时钟网络进行系统级的时钟管理和偏移控制,具有时钟倍频、分频、相位偏移和可编程占空比的功能 Xilinx 7 系列器件中的时钟资源包含了时钟管理…

Kata3.0.0 x LifseaOS x 龙蜥内核三管齐下!带你体验最新的安全容器之旅

文/云原生SIG 北京时间 2022 年 10 月 10 日,袋鼠 RunD 安全容器(Rust Kata runtime Dragonball VMM)正式作为安全容器上游 Kata Container 3.0.0 release 版本的重要特性发布。 龙蜥体验包 安全容器作为龙蜥云原生重要项目,我…

EEG微状态预测并发fMRI动态功能连接状态

前言 静息态功能磁共振成像(rs-fMRI)测量的大脑功能连接在多个时间尺度上有所不同,并确定了循环的动态功能连接(dFC)状态。这些发现与不同的认知和病理状态有关,有可能作为疾病的生物标志物,但它们的神经基础仍然存在争议。在静息态EEG研究中…

docker常见问题汇总(持续更新中)

Docker pull 时报错如下: -bash-4.2# docker pull hub.yj.com/test/dep_client:test Error response from daemon: Get http://hub.yj.com/v2/: dial tcp: lookup hub.yj.com on 218.2.135.1:53: server misbehaving如下图: 原因解析: 本地…

【算法系列】非线性最小二乘-高斯牛顿法

系列文章目录 【算法系列】卡尔曼滤波算法 【算法系列】非线性最小二乘求解-直接求解法 【算法系列】非线性最小二乘求解-梯度下降法 【算法系列】非线性最小二乘-高斯牛顿法 文章目录 系列文章 文章目录 前言 一、牛顿法 二、高斯-牛顿法 1.由牛顿法推导 2.直接展…

深度学习入门(四十三)计算机视觉——锚框

深度学习入门(四十三)计算机视觉——锚框前言计算机视觉——锚框课件锚框IoU交并比赋予锚框符号使用非极大值抑制(NMS)输出总结教材1 生成多个锚框2 交并比(IoU)3 在训练数据中标注锚框3.1 将真实边界框分配…

UE5笔记【二】添加实体和材质。后处理体积影响全局和局部。

材质 将平面赋予材质,显示不同的样式和纹理。 除了拖拽方式:还可以下拉列表的方式选择。 添加实例对象 可以添加引擎中关于room的内容,使得上一篇中所讲内容,更加直白查看。比如光影。 构造一个场景。 后处理体积 用途&#xff…