iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >一文了解Seata的实现原理
  • 639
分享到

一文了解Seata的实现原理

2024-04-02 19:04:59 639人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录一、背景二、分布式事务规范2.1、分布式事务相关概念2.2、分布式事务实现规范2.2.1、XA2.2.2、柔性事务的最终一致性三、Seata 架构3.1、系统组成3.2、工作模式

一、背景

大型厂商根据分布式事务实现规范,实现了不同的分布式框架,以简化业务开发者处理分布式事务相关工作,让开发者专注于核心业务开发。

Seata就是这么一个分布式事务处理框架,Seata是由阿里开源,前身为Fescar,经过品牌升级变身Seata。

二、分布式事务规范

2.1、分布式事务相关概念

事务:一个程序执行单元,是用户定义的一组操作序列,需要满足ACID属性。

本地事务:事务由本地资源管理器管理。

分布式事务:事务的操作位于不同的节点。

分支事务:在分布式事务中,由资源管理器管理的本地事务。

全局事务:一次性操作多个资源管理器完成的事务,由一组分支事务组成。

2.2、分布式事务实现规范

对于本地事务,可以借助DBMS系统来实现事务的管理,但是对于分布式事务,它就无能为力了。对于分布式事务,目前主要有2种思路:XA协议的强一致规范以及柔性事务的最终一致性规范。

2.2.1、XA

XA是基于2阶段提交协议设计的接口标准,实现了XA规范的资源管理器就可以参与XA全局事务。应用承担事务管理器TM工作,数据库承担资源管理器RM工作,TM生成全局事务id,控制RM的提交和回滚。

2.2.2、柔性事务的最终一致性

该规范主要有3种实现方式,TCC、MQ事务消息、本地消息表。(还存在其他一些不常用实现方式如Saga)。

TCC:try/confirm/cancel,在try阶段定资源,confirm阶段进行提交,资源锁定失败执行cancel阶段释放资源。

MQ事务消息:前提消息系统需要支持事务如RocketMQ,在本地事务执行前,发送事务消息prepare,本地事务执行成功,发送事务消息commit,实现分布式事务最终一致性。如果事务消息commit失败,RocketMQ会回查消息发送者确保消息正常提交,如果步骤5执行失败,进行重试,达到最终一致性。

本地消息表:跟MQ事务消息类似,区别在于MQ不支持事务消息,需要借助本地数据库的事务管理能力。在步骤1中将需要发送的消息和本地事务一起提交到DB,借助DB的事务管理确保消息持久化。步骤2应用通过本地消息表扫描,重试发送,确保消息可以发送成功。

三、Seata 架构

3.1、系统组成

Seata有三个核心组件:

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

三个组件相互协作,TC 以 Server 形式独立部署,TM和RM集成在应用中启动,其整体交互如下:

3.2、工作模式

Seata 支持四种工作模式:

3.2.1、AT(Auto Transaction)

AT模式是Seata默认的工作模式。需要基于支持本地 ACID 事务的关系型数据库,Java 应用,通过 JDBC 访问数据库。

整体机制:

该模式是XA协议的演变,XA协议是基于资源管理器实现,而AT并不是如此。AT的2个阶段分别是:

一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。二阶段:提交异步化,非常快速地完成;回滚通过一阶段的回滚日志进行反向补偿。

下图中,步骤1开启全局事务;步骤2注册分支事务,这里对应着一阶段;步骤3提交或者回滚分支事务,对应着二阶段。

特点:

优点:对代码无侵入;并发度高,本地锁在一阶段就会释放;不需要数据库对XA协议的支持。

缺点:只能用在支持ACID的关系型数据库;sql解析还不能支持全部语法。

3.2.2、TCC

该模式工作分为三个阶段:

上图中对于多个分支事务,省略了多次出现的 2.* 步骤。对于全局事务执行过程中业务应用宕机情况,业务应用集群中对等节点会通过从TC获取相关会话,从DB加载详细信息来恢复状态机。

特点:

优点:一阶段提交本地事务,无锁,高性能;事件驱动架构,参与者可异步执行,高吞吐;补偿服务易于实现。

缺点:不保证隔离性。

3.2.3、XA模式

XA是基于二阶段提交设计的接口标准。对于支持XA的资源管理器,借助Seata框架的XA模式,会使XA方案更简单易用。使用前提:需要分支数据库支持XA 事务,应用为 Java应用,且使用JDBC访问数据库。

整体机制:

在 Seata 定义的分布式事务框架内,利用事务资源(数据库、消息服务等)对 XA 协议的支持,以 XA 协议的机制来管理分支事务的一种 事务模式。

执行阶段:业务sql在XA分支中执行,由分支事务的RM管理器管理,然后执行XA prepare。完成阶段:TM根据各个分支执行结果通过TC通知各个分支执行XA commit或者XA rollback。

特点:

优点:继承了XA协议的优势,事务具有强一致性。

缺点:同样继承了XA协议的劣势,由于分支事务长时间开启,并发度低。2.5 Seata 各模式对比

分布式事务方案没有银弹,根据自己的业务特性选择合适的模式。例如追求强一致性,可以选择AT和XA,存在和外部系统对接,可以选择Saga模式,不能依赖本地事务,可以采用TCC等等。结合各模式的优缺点进行选择。

四、AT 模式核心实现

鉴于Seata支持的模式较多,而其默认的模式是AT,为节省篇幅,以下围绕AT模式分析其相关的核心模块实现。

4.1、事务协调器的启动

TC(事务协调器)以独立的服务启动,作为Server,维护全局事务和分支事务的状态,驱动全局事务提交或回滚。下面是TC的启动流程:

4.2、事务管理器的启动

TM(事务管理器)集成在应用中启动,负责定义全局事务的范围,开始事务、提交事务、回滚事务。
TM所在应用中需要配置GlobalTransactionScannerbean,在应用启动时会进行如下初始化流程:

4.3、资源管理器的启动

RM(资源管理器)集成在应用中启动,负责管理分支事务上的资源,向TC注册分支事务,汇报分支事务状态,驱动分支事务的提交或回滚。
RM所在的应用中除了需要跟TM一样配置GlobalTransactionScanner以启动RMClient,还需要配置DataSourceProxy,以实现对数据源访问代理。该数据源代理实现了sql的解析 →生成undo-log →业务sql和undo-log一并本地提交等操作。

4.4、全局事务的工作流程

下面以一个简单的例子来说明全局事务的工作原理:

  • BusinessService:发起购买服务
  • StorageService:库存管理服务

购买操作实现在businessService.purchase中,purchase方法实现上通过GlobalTransaction注解,通过dubbo服务,调用了库存服务deduct方法方法,样例如下:


@GlobalTransactional(timeoutMills = 300000, name = "dubbo-demo-tx")
public void purchase(String userId, String commodityCode, int orderCount) {
    storageService.deduct(commodityCode, orderCount);
    // throw new RuntimeException("xxx");
}

4.4.1、成功的全局事务处理流程

4.4.2、成功的全局事务处理流程

这里设定BusinessService在成功调用StorageService后,本地出现异常。

4.5、写隔离实现

全局事务未提交,分支事务本地已经提交的情况下(假设修改了资源A),如何避免其他事务在此时修改资源A?Seata采用全局锁来实现,其流程如下:

4.6、读隔离实现

在数据库本地隔离级别为读已提交或以上的基础上,Seata提供了读未提交,这个很好理解,全局事务提交前分支事务本地已经提交。如果想要实现读已提交,则需要在select语句上加for update。

五、总结

Seata是Java领域很强大的分布式事务框架,其支持了多种模式。其中默认支持的AT模式,相比于传统的2PC协议(基于数据库的XA协议),很好地解决了2PC长期锁资源的问题,提高了并发度。Seata支持的各个模式中,AT模式对业务零入侵实现分布式事务,对于开发者更加友好。另外Seata的Server在选择合适的存储介质时可以进行集群模式,减少单点故障影响。

以上就是一文了解Seata的实现原理的详细内容,更多关于Seata原理的资料请关注编程网其它相关文章!

--结束END--

本文标题: 一文了解Seata的实现原理

本文链接: https://www.lsjlt.com/news/128461.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一文了解Seata的实现原理
    目录一、背景二、分布式事务规范2.1、分布式事务相关概念2.2、分布式事务实现规范2.2.1、XA2.2.2、柔性事务的最终一致性三、Seata 架构3.1、系统组成3.2、工作模式...
    99+
    2024-04-02
  • 一文了解Java动态代理的原理及实现
    代理是指:某些场景下对象会找一个代理对象,来辅助自己完成一些工作,如明星的经纪人、买房的人找房产中介等。 代理主要是对对象的行为额外做一些辅助操作。  如何创建代理对象: ...
    99+
    2024-04-02
  • 一文了解什么是CDN及实现原理
    目录正文dns解析流程让我们来一步步分析解析流程:腾讯云cdn实例正文 由于用户访问源站业务有性能瓶颈,通过cdn技术把源站的内容缓存到多个节点。用户向源站域名发起请求时,请求会被调...
    99+
    2023-05-19
    CDN实现原理 什么是CDN
  • 一篇文章带你了解C++多态的实现原理
    目录虚函数和多态多态的作用多态的一个例子构造函数和析构函数中存在多态吗?多态的实现原理虚函数表虚析构函数纯虚函数和抽象类总结虚函数和多态 虚函数: 在类的定义中,前面有 v...
    99+
    2024-04-02
  • 一文详解 Compose Navigation 的实现原理
    目录前言1. 从 Jetpack Navigation 说起2. 定义导航3. 导航跳转4. 保存状态SaveableStateHolder & rememberSaveab...
    99+
    2024-04-02
  • 一文彻底理解Golang闭包实现原理
    目录前言函数一等公民作用域实现闭包闭包扫描闭包赋值闭包函数调用函数式编程总结前言 闭包对于一个长期写 Java 的开发者来说估计鲜有耳闻,我在写 Pyt...
    99+
    2024-04-02
  • 深入了解vuex的实现原理
    当面试被问vuex的实现原理,你要怎么回答?下面本篇文章就来带大家深入了解一下vuex的实现原理,希望对大家有所帮助!关于vuex就不再赘述,简单回顾一下:当应用碰到多个组件共享状态时,简单的单向数据流很容易被破坏:第一,多个视图依赖于同一...
    99+
    2023-05-14
    javascript vuex
  • 一文详解Golang中net/http包的实现原理
    目录前言http包执行流程http包源码分析端口监听请求解析路由分配响应处理前言 Go语言自带的net/http包提供了HTTP客户端和服务端的实现,实现一个简单的http服务非常容...
    99+
    2024-04-02
  • 一文聊聊Vue-Router的实现原理
    路由既然我们在分析路由,我们首先来说说什么是路由,什么是后端路由、什么是前端路由。路由就是根据不同的 url 地址展示不同的内容或页面,早期路由的概念是在后端出现的,通过服务器端渲染后返回页面,随着页面越来越复杂,服务器端压力越来越大。后来...
    99+
    2023-05-14
    vue-router Vue
  • 一文带你了解MySQL之连接原理
    目录一、连接简介1.1 连接的本质1.2 连接过程简介1.3 内连接和外连接1.4 左外连接1.5 右外连接1.6 内连接小结二、连接的原理2.1 嵌套循环连接(Nested-Loop Join)2.2 使用索引加快连接...
    99+
    2023-05-22
    MySQL连接原理 MySQL 连接
  • 一文详解凯撒密码的原理及Python实现
    目录一、什么是恺撒密码二、程序运行环境三、恺撒密码:加密3.1 恺撒密码加密实例程序3.2 恺撒密码加密实例程序运行结果四、恺撒密码:解密4.1 恺撒密码解密实例程序4.2 恺撒密码...
    99+
    2024-04-02
  • 一文带你解密Python迭代器的实现原理
    目录可迭代对象与迭代器迭代器的创建迭代器的底层结构元素迭代的具体过程小结可迭代对象与迭代器 Python 一切皆对象,类型对象定义了哪些操作,决定了实例对象拥有哪些行为。 比如类型对...
    99+
    2022-12-14
    Python迭代器原理 Python迭代器
  • 深入了解vue-router原理并实现一个小demo
    目录插件编写的基本方法需求分析我们先看看vue-router的使用步骤由此我们看看vue-router内部做了什么?实现思路首先我们看看如何将$router挂载到组件上​​如何实现那...
    99+
    2024-04-02
  • 一文带你了解Mysql主从同步原理
    目录Mysql 主从同步原理简析1、什么是主从 2、为什么要搞主从呢? 3、如何实现主从同步呢? 4、mysql 主从同步的原理 Mysql 主从同步原理简析 在开始讲述原理的情况下...
    99+
    2024-04-02
  • 一文了解Spring中拦截器的原理与使用
    目录1.Spring中的拦截器1.1HandlerInterceptor拦截器1.2 MethodInterceptor拦截器2.二者的区别1.Spring中的拦截器 在web开发中...
    99+
    2024-04-02
  • 图解 Promise 实现原理(一)—— 基础实现
    本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/UNzYgpnKzmW6bAapYxnXRQ 作者:孔垂亮很多同学在学习 Promise 时,知其然却不知其所以然,对其中的...
    99+
    2023-06-03
  • 一文搞懂JavaMD5算法的原理及实现
    目录MD5加密简介MD5加密原理MD5加密常用方法MD5加密简介 哈希算法又称散列算法,是将任何数据转换成固定长度的算法的统称。 从本质上讲,MD5也是一种哈希算法,其输出...
    99+
    2024-04-02
  • 一文详解手动实现Recoil状态管理基本原理
    目录前言我们先看一下Recoil的基本使用手动实现前言 目前,前端流行的状态管理有很多,Redux、Mobx、Mobx-lite、Recoil、jotai、xstate等等,根据多年...
    99+
    2023-05-19
    Recoil基本原理 Recoil状态管理
  • 深入了解Golang interface{}的底层原理实现
    目录前言interface数据结构ifaceeface总结前言 在 Go 语言没有泛型之前,接口可以作为一种替代实现,也就是万物皆为的 interface。那到底 interface...
    99+
    2024-04-02
  • 一文带你了解SpringBoot中常用注解的原理和使用
    目录@AutoConfiguration@Import@ConfigurationProperties@AutoConfiguration 读取所有jar包下的 /META-INF/...
    99+
    2022-11-13
    SpringBoot常用注解原理 SpringBoot常用注解使用 SpringBoot常用注解 SpringBoot注解
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作