电商项目part09 分布式事务SeataMQ可靠消息

news2025/1/17 15:38:43

分布式事务

在微服务架构中,完成某一个业务功能可能需要横跨多个服务,操作多个数据库。这就涉及到到了分布式事务,需要操作的资源位于多个资源服务器上,而应用需要保证对于多个资源服务器的数据操作,要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同资源服务器的数据一致性。

电商项目中会结合下单的业务重点讲解两种分布式事务解决方案:

  • 2PC的方案: 基于Seata AT实现
  • mq可靠消息的方案:基于Rocketmq事务消息实现

Seata架构

在 Seata 的架构中,一共有三个角色:

  • TC (Transaction Coordinator) - 事务协调者
    维护全局和分支事务的状态,驱动全局事务提交或回滚。
  • TM (Transaction Manager) - 事务管理器
    定义全局事务的范围:开始全局事务、提交或回滚全局事务。
  • RM (Resource Manager) - 资源管理器
    管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

其中,TC 为单独部署的 Server 服务端,TM 和 RM 为嵌入到应用中的 Client 客户端。

在 Seata 中,一个分布式事务的生命周期如下:

  1. TM 请求 TC 开启一个全局事务。TC 会生成一个 XID 作为该全局事务的编号。XID会在微服务的调用链路中传播,保证将多个微服务的子事务关联在一起。
  2. RM 请求 TC 将本地事务注册为全局事务的分支事务,通过全局事务的 XID 进行关联。
  3. TM 请求 TC 告诉 XID 对应的全局事务是进行提交还是回滚。
  4. TC 驱动 RM 们将 XID 对应的自己的本地事务进行提交还是回滚。
    (branch表,lock表,log表)
    在这里插入图片描述

分布式事务结合分库分表

ShardingSphere整合Seata

引入依赖

<!‐‐shardingsphere整合seata依赖‐‐>
<dependency>
  <groupId>org.apache.shardingsphere</groupId>
  <artifactId>sharding‐transaction‐base‐seata‐at</artifactId>
  <version>4.1.1</version>
</dependency>

配置seata.conf
包含 Seata 柔性事务的应用启动时,用户配置的数据源会根据 seata.conf 的配置,适配为
Seata 事务所需的 DataSourceProxy,并且注册至 RM 中。

client {
  application.id = tulingmall‐order‐curr
  transaction.service.group = tuling‐order‐group
}

开启全局事务配置
核心类SeataATShardingTransactionManager

//全局事务交给SeataATShardingTransactionManager管理
@ShardingTransactionType(TransactionType.BASE)
@Transactional
public CommonResult generateOrder(OrderParam orderParam, Long memberId) {
...
}

在这里插入图片描述

注意:GlobalTransactional和ShardingTransactionType不能同时出现,此处不能使用@GlobalTransactional。同时需要关闭数据源自动代理

 seata:
  enable‐auto‐data‐source‐proxy: false #关闭数据源自动代理,交给sharding‐jdbc那边
  

可靠消息最终一致性方案实现

可靠消息最终一致性方案是指当事务发起执行完成本地事务后并发出一条消息,事务参与方(消息消费者)一定能够接收消息并处理事务成功,此方案强调的是只要消息发给事务参与方最终事务要达到一致。

RocketMQ保证消息不丢

生产端:同步消息(ACK机制)

存储端:同步刷盘

消费端:手动offset

Rocketmq事务消息实现

RocketMQ事务消息设计则主要是为了解决Producer端的消息发送与本地事务执行的原子性问题,RocketMQ的设计中broker与producer端的双向通信能力,使得broker天生可以作为一个事务协调者存在;而RocketMQ本身提供的存储机制为事务消息提供了持久化能力;RocketMQ的高可用机制以及可靠消息设计则为事务消息在系统发生异常时依然能够保证达成事务的最终一致性。

在RocketMQ 4.3后实现了完整的事务消息,实际上其实是对本地消息表的一个封装,将本地消息表移动到了MQ内部,解决Producer端的消息发送与本地事务执行的原子性问题。
在这里插入图片描述

执行流程如下 :

1)Producer发送事务消息
Producer(MQ发送方)发送事务消息至MQ Server,MQ Server将消息状态标记为Prepared(预览状态),注意此时这条消息消费者(MQ订阅方)是无法消费到的。
2)MQ Server回应消息发送成功
MQ Server接收到Producer发送给的消息则回应发送成功表示MQ已接收到消息。
3)Producer执行本地事务
Producer端执行业务代码逻辑,通过本地数据库事务控制。
4)消息投递
若Producer本地事务执行成功则自动向MQ Server发送commit消息,MQ Server接收到commit消息后将消费消息,消费成功则向MQ回应ack,否则将重复接收消息。这里ack默认自动回应,即程序执行正常则自动回应ack

以上主干流程已由RocketMQ实现,只需要分别实现本地事务执行以及本地事务回查方法,因此只需关注本地事务的执行状态即可。

RocketMQ提供RocketMQLocalTransactionListener接口 :

public interface RocketMQLocalTransactionListener {
/**
  * 发送prepare消息成功此方法被回调,该方法用于执行本地事务
  * @param msg 回传的消息,利用transactionId即可获取到该消息的唯一Id
  * @param arg 调用send方法时传递的参数,当send时候若有额外的参数可以传递到send方法中,这里能获取到
  *@return 返回事务状态,COMMIT :提交 ROLLBACK :回滚 UNKNOW :回调
  */
	RocketMQLocalTransactionState executeLocalTransaction(Message msg,Object arg);
/**
 * @param msg 通过获取transactionId来判断这条消息的本地事务执行状态
 * @return 返回事务状态,COMMIT :提交 ROLLBACK :回滚 UNKNOW :回调
 */
 	RocketMQLocalTransactionState checkLocalTransaction(Message msg);
 }

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

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

相关文章

数据统计汇总聚合

一些方法 特殊&#xff1a;数据聚合 可加入排序

Leetcode: 1. 两数之和 【题解超详细】

前言 有人夜里挑灯看花&#xff0c;有人相爱&#xff0c;有人夜里开车看海&#xff0c;有人leetcode第一题都做不出来。 希望下面的题解可以帮助你们开始 你们的 leetcode 刷题 的 天降之路 题目 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中…

Linux配置ADSL链接

在Linux中配置ADSL链接&#xff0c;可以按照以下步骤进行&#xff1a; 安装rp-pppoeconf工具&#xff0c;这个工具可以通过终端窗口使用。运行命令“rp-pppoeconf”来配置ADSL链接。终端窗口会显示一个向导模式&#xff0c;用于配置ADSL链接。输入用户名和密码。这些信息是用来…

强强联手 | 大势智慧与山维科技签署战略合作协议

8月30日&#xff0c;武汉大势智慧科技有限公司&#xff08;以下简称“大势智慧”&#xff09;与北京山维科技股份有限公司&#xff08;以下简称“山维科技”&#xff09;达成战略合作。双方将聚焦新型基础测绘建设与实景三维中国领域&#xff0c;携手为广大用户提供数据采集、生…

ShardingJDBC——分库分表实践

摘要 本文主要介绍分表分库&#xff0c;以及SpringBoot集成基于ShardingJDBC的单库分表实践。 一、Sharding-JDBC Sharding-JDBC是ShardingSphere的第一个产品&#xff0c;也是ShardingSphere的前身。 它定位为轻量级Java框架&#xff0c;在Java的JDBC层提供的额外服务。它使…

stable diffusion实践操作-embedding(TEXTUAL INVERSION)

本文专门开一节写图生图相关的内容&#xff0c;在看之前&#xff0c;可以同步关注&#xff1a; stable diffusion实践操作 可以理解为提示词的集合&#xff0c;可以省略大量的提示词。后缀safetensors&#xff0c;大小几十kb 正文 1、功能 可以理解为提示词的集合&#xff0…

IntelliJ IDEA创建Web项目并使用Web服务器----Tomcat

&#x1f3c6;IntelliJ IDEA创建Web项目并使用Web服务器----Tomcat 以下是本篇文章正文内容&#xff0c;下面案例可供参考&#xff08;提示&#xff1a;本篇文章属于原创&#xff0c;请转发或者引用时注明出处。&#xff09;&#xff0c;大家记得支持一下&#xff01;&#xff…

【权限提升-Windows提权】-UAC提权之MSF模块和UACME项目-DLL劫持-不带引号服务路径-不安全的服务权限

权限提升基础信息 1、具体有哪些权限需要我们了解掌握的&#xff1f; 后台权限&#xff0c;网站权限&#xff0c;数据库权限&#xff0c;接口权限&#xff0c;系统权限&#xff0c;域控权限等 2、以上常见权限获取方法简要归类说明&#xff1f; 后台权限&#xff1a;SQL注入,数…

云原生架构-架构师之路(十九)

云原生架构内涵 云原生架构 基于云原生技术&#xff0c;指将 云应用中的非业务代码部分进行最大化的剥离&#xff0c;让 云设施接管项目中大量非功能特性&#xff08;如弹性、韧性、安全、可观测性和灰度等&#xff09;。把质量属性 和 业务功能完全分离&#xff0c;我们自己的…

美创科技获通信网络安全服务能力评定(应急响应一级)认证!

近日&#xff0c;中国通信企业协会公布通信网络安全服务能力评定2023年第一批获证企业名单。 美创科技获得应急响应一级资质&#xff0c;成为2023年第一批获证企业之一&#xff01; 通信网络安全服务能力评定是对通信网络安全服务单位从事通信网络安全服务综合能力的评定&#…

死锁 银行家算法

死锁 产生死锁的四个条件 资源互斥&#xff1a;资源是独占的且排他使用&#xff0c;进程互斥使用资源&#xff0c;即任意时刻一个资源只能给一个进程使用&#xff0c;其他进程若申请一个资源&#xff0c;而该资源被另一进程占有时&#xff0c;则申请者等待直到资源被占有者释…

Vue前端的一些表格组件的思考

当我们需要在前端中展示一些表格内容时&#xff0c;我们往往使用Vue的table来实现 1. 原生态实现 <template><div><table class"no-gap-table"><thead><tr><th class"styled-header" colspan"4">Column1&…

在ubuntu上安装ns2和nam(ubuntu16.04)

在ubuntu上安装ns2和nam 版本选择安装ns2安装nam 版本选择 首先&#xff0c;版本的合理选择可以让我们避免很多麻烦 经过测试&#xff0c;ubuntu的版本选择为ubuntu16.04&#xff0c;ns2的版本选择为ns-2.35&#xff0c;nam包含于ns2 资源链接(百度网盘) 链接:https://pan.bai…

Leetcode Top 100 Liked Questions(序号198~234)

​198. House Robber ​ 题意&#xff1a;你是一个强盗&#xff0c;你要去抢劫&#xff0c;每个房子都有特定金额的钱&#xff0c;但是不能拿相邻的房子的钱 我的思路 有点像动态规划&#xff0c;但是首先把每个结点空一格的后缀和得到&#xff0c;2n 之后从(in-1;i>0;i…

详解I2C

I2C&#xff08;也常写作 I I C IIC IIC&#xff0c; I 2 C I^2C I2C&#xff09;&#xff0c;全称为Inter-Integrated Circuit&#xff08;“互连集成电路”&#xff09;&#xff0c;用于在集成电路之间进行短距离数据传输。它由Philips&#xff08;现在的NXP半导体&#xff0…

龙迅LT6911UXE HDMI转2PORT MIPIDSI/CSI,支持单PORT 4K60HZ,内置MCU,加音频

龙迅LT6911UXE 1.描述&#xff1a; LT6911UXE是一款高性能HDMI2.0到MIPI DSI/CSI转换器&#xff0c;可用于VR、智能手机和显示器应用。 HDMI2.0输入支持高达6Gbps的数据速率&#xff0c;这为60Hz的视频提供了足够的带宽。同时&#xff0c;还支持 HDCP2.3进行数据解密。对于M…

centos7.6离线升级gcc

1.下载需要的gcc&#xff0c;我这里下载的8.3.0版本&#xff1a; 各版本gcc下载地址 2.上传服务器后解压&#xff1a; tar -zvxf gcc-8.3.0.tar.gz --directory/usr/local/3.进入目录&#xff1a; cd /usr/local/gcc-8.3.0/contrib4.查看需要的依赖包具体是什么版本&#xf…

Navigation的基本使用

参考&#xff1a; Navigation Navigation的基本使用 目录 一、Navigation是什么&#xff1f;二、Navigation的三大件三、基本使用1. 导入依赖2. 创建三个不同的fragment用于页面的切换3. 创建导航图4. 设置导航menu5. Activity使用 四、Navigation源码原理解析 一、Navigation是…

基础算法-枚举算法

”现象“ 基础算法-枚举方法-学习 方法&#xff1a; 将问题的所有可能的答案一一列举&#xff0c;然后根据条件判断此答案是否合适&#xff0c;保留合适的&#xff0c;舍弃不合适的 优化点&#xff1a; 尽量减少枚举的可能&#xff0c;减少枚举的范围与条件尽量对问题简单化…

操作系统备考学习 day1 (1.1.1-1.3.1)

操作系统备考学习 day1 计算机系统概述操作系统的基本概念操作系统的概念、功能和目标操作系统的四个特征并发共享虚拟异步 操作系统的发展和分类操作系统的运行环境操作系统的运行机制 年初做了一个c的webserver 的项目&#xff0c;在学习过程中已经解除部分操作系统的知识&am…