Apache Seata 新版本集成了 RocketMQ 事务消息

大家好,我是君哥。

Apache Seata 是一款高性能、简单易用的分布式事务中间件,它包含 AT、TCC、SAGA 和 XA 四种模式。

在最近发布的新版本中,Apache Seata 引入了 RocketMQ 中间件,并且跟 RocketMQ 的事务消息配合使用。今天我们来聊一聊这个话题。

Seata 两阶段提交

Seata 的分布式事务解决方案使用两阶段提交,以最流行的 TCC 模式为例,Seata 中设计了 3 个主要的角色:

  • TM:管理全局事务,包括开启全局事务,提交/回滚全局事务;

  • RM:管理分支事务;

  • TC: 事务协调器,管理全局事务和分支事务的状态。

下图是一个电商场景的分布式事务场景,包括订单、库存和账户三个服务。TM 开启全局事务后,在第一阶段,订单服务、库存服务和账户服务分别作为一个 RM 向 TC 注册分支事务,并且向 TC 上报分支事务执行状态。如果三个分支事务都执行成功,TM 会给 TC 发送 commit 执行,否则发送 rollback 指令。在第二阶段,TC 会根据 TM 的指令,决定分支事务 commit 或者 rollback。

RocketMQ 事务消息

作为分布式事务的解决方案,RocketMQ 的事务消息也可以供我们选择。RocketMQ 的事务消息,主要是保证了本地方法执行和消息发送在一个分布式事务中,要不全部成功,要不全部失败。见下图:

这里给出一个账户服务和库存服务在一个分布式事务中的例子,本地方法执行扣减账户金额,RocketMQ 消费者消费账户服务发送的消息后执行扣减库存。RocketMQ 通过发送 half 消息来实现,下面详细说明一下:

  1. 账户服务向 Broker 发送一条 half 消息;

  2. half 消息发送成功后,账户服务执行本地事务;

  3. 如果账户服务执行本地事务成功,则向 Broker 发送 commit 请求,否则发送 rollback 请求;

  4. 如果 Broker 收到的是 rollback 请求,则删除保存的 half 消息;

  5. 如果 Broker 收到的是 commit 请求,则把 half 消息投递到真实的队列等待库存服务来拉取,然后删除保存的 half 消息;

  6. 如果 Broker 没有收到请求,则会发送请求到 Producer 查询本地事务状态,然后根据 Producer 返回的本地状态做 commit/rollback 相关处理。

Seata 的改进

Seata 的改进主要在 prepare 阶段。Seata 提供了一个 SeataMQProducer 类,把 RocketMQ 中 TransactionListener 的方法加入到全局事务。见下面代码:

SeataMQProducer(final String namespace, final String producerGroup, RPCHook rpcHook) {super(namespace, producerGroup, rpcHook);this.transactionListener = new TransactionListener() {@Overridepublic LocalTransactionState executeLocalTransaction(Message msg, Object arg) {return LocalTransactionState.UNKNOW;}@Overridepublic LocalTransactionState checkLocalTransaction(MessageExt msg) {String xid = msg.getProperty(PROPERTY_SEATA_XID);if (StringUtils.isBlank(xid)) {LOGGER.error("msg has no xid, msgTransactionId: {}, msg will be rollback", msg.getTransactionId());return LocalTransactionState.ROLLBACK_MESSAGE;}GlobalStatus globalStatus = DefaultResourceManager.get().getGlobalStatus(SeataMQProducerFactory.ROCKET_BRANCH_TYPE, xid);if (COMMIT_STATUSES.contains(globalStatus)) {return LocalTransactionState.COMMIT_MESSAGE;} else if (ROLLBACK_STATUSES.contains(globalStatus) || GlobalStatus.isOnePhaseTimeout(globalStatus)) {return LocalTransactionState.ROLLBACK_MESSAGE;} else if (GlobalStatus.Finished.equals(globalStatus)) {LOGGER.error("global transaction finished, msg will be rollback, xid: {}", xid);return LocalTransactionState.ROLLBACK_MESSAGE;}return LocalTransactionState.UNKNOW;}};
}

在 prepare 阶段,SeataMQProducer 向 RocketMQ Broker 发送 half 消息,执行本地事务,如果执行成功,则强行把 LocalTransactionState 改回 UNKNOW,等待 TC 发送指令,决定是 commit 或 rollback。如果执行失败,返回 ROLLBACK_MESSAGE,TC 下发指令,回滚全局事务。

需要注意的是,Broker 收到 half 消息后,如果没有收到 commit/rollback 消息,则会回查 Producer 本地事务状态,也就是上面代码中的 checkLocalTransaction。这里不是检查分支事务状态,而是检查全局事务状态,使用 XID 去查询。

集成 RocketMQ 之后,Seata 的分布式事务调用流程如下图,这里以 订单服务、库存服务两个服务为例:

总结

Apache Seata 引入 RocketMQ 后,支持的分布式事务场景更加丰富,MQ 的异步特性也让事务模型整体性能提升。希望本文对你理解 Seata 中 RocketMQ 的使用有所帮助。

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

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

相关文章

界面控件DevExtreme中文教程 - 如何与Amazon S3和Azure Blob存储集成?

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NET Core,jQuery,Knockout等)构建交互式的Web应用程序。从Angular和Reac&#xff0c…

顺序表(一)(数据结构)

一. 线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列 。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构,是人为想象出来的数…

1024程序员节 | QT进阶学习——如何通过QT连接云服务器的MySQL数据库并进行数据库操作 和 数据表的增删改查

目录 引出连接本地MySQL1.首先下载MySQL的ODBC驱动2.启动运行,创建用户数据源补充:ANSI 版和 Unicode 版 3.qt代码连接 如何连接华为云服务器中的MySQL1.在Centos中安装Linux版本的ODBC驱动2.在ODBC连接管理器中建立和华为云的链接3.qt代码通过ODBC连接华…

【微软商店平台】如何将exe打包上传微软商店

打开微软合作者中心:https://partner.microsoft.com/en-us/dashboard/home点击App and Games板块可以创建项目。 3. 重新生成包含私钥的自签名证书 运行以下命令,确保生成的证书包含私钥: New-SelfSignedCertificate -Type CodeSigning -Su…

【Java设计模式】1-15章

第1章 内容介绍 1.1 Java设计模式内容介绍 1.1.1 先看几个经典的面试题 1.1.2 设计模式的重要性 1.2 课程亮点和授课方式 第2章 设计模式七大原则 2.1 设计模式的目的 2.2 设计模式七大原则 2.3 ①单一职责原则 方案1 package com.atguigu.principle.singleresponsibili…

【Nuvoton干货分享】开发应用篇 4 -- 8bit MCU Flash 操作

我们在进行实际开发设计中,难免需要进行数据存储,早期很多都是外接EEPROM来进行设计,但是需要增加成本。其实芯片内部的Flash也是可以当成数据存储空间的。本章节主要介绍新唐的8位机如何进行常量数据的存储操作。 一、存储空间划分 我这边…

力扣hot100--DFS/BFS

DFS/BFS 1. 79. 单词搜索 中等 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相…

2024 睿抗机器人开发者大赛(RAICOM)-【网络安全】CTF 部分WP

文章目录 一、前言二、MICS你是黑客么循环的压缩包Goodtime 三、WEBpy 四、Crypto变异凯撒RSAcrypto3 一、前言 WP不完整,仅供参考! 除WEB,RE,PWN外,其余附件均已打包完毕 也是一个对MISC比较友好的一个比赛~ 123网…

鲸鱼优化算法(Whale Optimization Algorithm, WOA)原理与MATLAB例程

鲸鱼优化算法(Whale Optimization Algorithm, WOA)是一种基于鲸鱼捕食行为的智能优化算法。它模拟了座头鲸在狩猎时的“气泡网”捕食策略。 文章目录 1.适应度函数2. 更新公式2.1 突袭行为2.2 螺旋更新3.线性递减参数4. 边界处理 MATLAB 实现示例代码说明…

C语言程序设计:现代设计方法习题笔记《chapter3》

第一题 ​ 代码示例&#xff1a; #include<stdio.h>int main() {printf("Enter a date&#xff08;mm/dd/yyyy&#xff09;: ");int day, month, year;scanf_s("%d/%d/%d", &month, &day, &year);printf("%04d%02d%02d", yea…

一款好用的搜索软件——everthing(搜索比文件资源管理器快)

everthing官网链接 在官网选择下载 1.下载后双击打开 2.点击OK&#xff08;需要其他语言自己选择&#xff09; 3.选择安装位置&#xff08;路径最好别带中文和空格&#xff09; 继续点击下一步 4. 点击下一步 5.继续点击安装 6.然后就完成了 7.点击打开然后就可以搜索了

Elastic Stack简介

本文内容参考了田雪松老师编著的《Elastic Stack应用宝典》 从ELK到Elastic Stack ELK是三个单词的首字母缩写&#xff0c;即Elasticsearch、Logstash和Kibana。 Elasticsearch用于数据存储与检索Logstash用于数据传输与清洗Kibana则用于数据可视化等领域 Elasticsearch的第…

AnaTraf | 网络性能监控系统NPM:提升网络性能与业务连续性

AnaTraf 网络性能监控系统NPM | 全流量回溯分析 | 网络故障排除工具 网络系统非常复杂&#xff0c;管理和维护它们也越来越具有挑战性。为了确保网络性能和业务的持续稳定运行&#xff0c;IT运维团队需要对网络进行实时监控、优化和快速排查故障。本文将围绕网络性能监控系统&…

raidrive 访问搭建的ftp服务报错超时的情况

尝试了很久&#xff0c;包括改用户权限和密码&#xff0c;后面根据ftp日志&#xff0c;查到用户登录是正常的 /var/log/vsftpd.log 就知道&#xff0c;不是密码问题也不是服务器端的问题&#xff0c;通过多次尝试发现是被动模式的问题&#xff0c;被动模式会通过其他端口进行交…

ChatGPT实现旅游推荐微信小程序

随着旅游行业的快速发展&#xff0c;个性化推荐已成为提升用户体验的重要手段。通过AI技术&#xff0c;提供一个智能旅游推荐小程序&#xff0c;使用户能够轻松获取定制化的旅行建议。 项目概述 项目目标 开发一个AI旅游推荐小程序&#xff0c;基于用户输入的旅行偏好&#…

前后端请求、返回数据的多种方式

Springboot项目的业务逻辑 &#x1f319;项目基本结构&#xff1a; 通常情况下&#xff0c;我们在搭建后端项目的时候&#xff0c;处理业务逻辑我们需要用到Controller,Service,Mapper(mybatis,mybatis-plus)&#xff0c;Entry各层之间的相互调用来完成&#xff0c;还有就是我…

Docker部署MySQL主从复制

1. 主从复制概念及优势 1.1 概念 MySQL主从复制是一种数据库复制技术&#xff0c;它允许将一个数据库服务器&#xff08;主服务器&#xff09;上的数据更改复制到一个或多个数据库服务器&#xff08;从服务器&#xff09;。这种技术在数据库管理和维护中扮演着重要的角色&…

Ubuntu 2张4090,显卡安装,无法双屏显示

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; Ubuntu20.04 安装nvidia显卡 在已经安装好nvidia显卡的情况下&#xff1a; 单屏幕无法修改屏幕分辨率 无法双屏显示 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 单屏幕无法…

【Origin科技绘图】最新Origin2024中文版软件安装教程

Origin是由OriginLab公司开发的一个科学绘图、数据分析软件,支持在MicrosoftWindows下运行。Origin支持各种各样的2D/3D图形。Origin中的数据分析功能包括统计,信号处理,曲线拟合以及峰值分析。Origin中的曲线拟合是采用基Levernberg-Marquardt算法(LMA)的非线性最小二乘法拟合…

理工科考研想考计算机,湖南大学、重大、哈工大威海、山东大学,该如何选择?

C哥专业提供——计软考研院校选择分析专业课备考指南规划 计算机对理工科同学来说&#xff0c;还是性价比很高的&#xff0c;具有很大的优势&#xff01; 一、就业前景广阔 高需求行业 在当今数字化时代&#xff0c;计算机技术几乎渗透到了各个领域&#xff0c;无论是互联网…