当前位置:网站首页>分布式事务Seata介绍
分布式事务Seata介绍
2022-04-23 14:51:00 【顶尖高中生】
Seata 是什么
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和XA 事务模式,为用户打造一站式的分布式解决方案。
Seata的三大角色
在 Seata 的架构中,一共有三个角色:
TC (Transaction Coordinator) - 事务协调者
维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM (Transaction Manager) - 事务管理器
定义全局事务的范围:开始全局事务、提交或回滚全局事务。
RM (Resource Manager) - 资源管理器
管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
其中,TC 为单独部署的 Server 服务端,TM 和 RM 为嵌入到应用中的 Client 客户端。
在 Seata 中,一个分布式事务的生命周期如下:
1.TM 请求 TC 开启一个全局事务。TC 会生成一个 XID 作为该全局事务的编号。XID,会在微服务的调用链路中传播,保证将多个微服务的子事务关联在一起。当一进入事务方法中就会生成XID , global_table 就是存储的全局事务信息 。
2.RM 请求 TC 将本地事务注册为全局事务的分支事务,通过全局事务的 XID 进行关联。当运行数据库操作方法,branch_table 存储事务参与者。
3.TM 请求 TC 告诉 XID 对应的全局事务是进行提交还是回滚。
4.TC 驱动 RM 们将 XID 对应的自己的本地事务进行提交还是回滚。
设计思路
AT模式的核心是对业务无侵入,是一种改进后的两阶段提交,其设计思路如图
第一阶段
业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。核心在于对业务sql进行解析,转换成undolog,并同时入库,这是怎么做的呢?先抛出一个概念DataSourceProxy代理数据源,通过名字大家大概也能基本猜到是什么个操作,后面做具体分析
第二阶段
分布式事务操作成功,则TC通知RM异步删除undolog
分布式事务操作失败,TM向TC发送回滚请求,RM 收到协调器TC发来的回滚请求,通过 XID 和 Branch ID 找到相应的回滚日志记录,通过回滚记录生成反向的更新 SQL 并执行,以完成分支的回滚。
整体执行流程
设计亮点
相比与其它分布式事务框架,Seata架构的亮点主要有几个:
1.应用层基于SQL解析实现了自动补偿,从而最大程度的降低业务侵入性。
2.将分布式事务中TC(事务协调者)独立部署,负责事务的注册、回滚。
3.通过全局锁实现了写隔离与读隔离。
存在的问题
性能损耗
一条Update的SQL,则需要全局事务xid获取(与TC通讯)、before image(解析SQL,查询一次数据库)、after image(查询一次数据库)、insert undo log(写一次数据库)、before commit(与TC通讯,判断锁冲突),这些操作都需要一次远程通讯RPC,而且是同步的。另外undo log写入时blob字段的插入性能也是不高的。每条写SQL都会增加这么多开销,粗略估计会增加5倍响应时间。
性价比
为了进行自动补偿,需要对所有交易生成前后镜像并持久化,可是在实际业务场景下,这个是成功率有多高,或者说分布式事务失败需要回滚的有多少比率?按照二八原则预估,为了20%的交易回滚,需要将80%的成功交易的响应时间增加5倍,这样的代价相比于让应用开发一个补偿交易是否是值得?
全局锁,热点数据
相比XA,Seata 虽然在一阶段成功后会释放数据库锁,但一阶段在commit前全局锁的判定也拉长了对数据锁的占有时间,这个开销比XA的prepare低多少需要根据实际业务场景进行测试。全局锁的引入实现了隔离性,但带来的问题就是阻塞,降低并发性,尤其是热点数据,这个问题会更加严重。
回滚锁释放时间
相比XA,Seata 虽然在一阶段成功后会释放数据库锁,但一阶段在commit前全局锁的判定也拉长了对数据锁的占有时间,这个开销比XA的prepare低多少需要根据实际业务场景进行测试。全局锁的引入实现了隔离性,但带来的问题就是阻塞,降低并发性,尤其是热点数据,这个问题会更加严重。
回滚锁释放时间
Seata在回滚时,需要先删除各节点的undo log,然后才能释放TC内存中的锁,所以如果第二阶段是回滚,释放锁的时间会更长。
死锁问题
Seata的引入全局锁会额外增加死锁的风险,但如果出现死锁,会不断进行重试,最后靠等待全局锁超时,这种方式并不优雅,也延长了对数据库锁的占有时间。
版权声明
本文为[顶尖高中生]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_55076626/article/details/124358979
边栏推荐
- Role of asemi rectifier module mdq100-16 in intelligent switching power supply
- thinkphp5+数据大屏展示效果
- 【JZ46 把数字翻译成字符串】
- One of the advanced applications of I / O reuse: non blocking connect -- implemented using select (or poll)
- Find daffodils - for loop practice
- We reference My97DatePicker to realize the use of time plug-in
- 【Proteus仿真】自动量程(范围<10V)切换数字电压表
- Leetcode151 - invert words in string - String - simulation
- What is the main purpose of PCIe X1 slot?
- Interviewer: let's talk about the process of class loading and the mechanism of class loading (parental delegation mechanism)
猜你喜欢
51 MCU + LCD12864 LCD Tetris game, proteus simulation, ad schematic diagram, code, thesis, etc
QT actual combat: Yunxi calendar
eolink 如何助力遠程辦公
Swift - literal, literal protocol, conversion between basic data types and dictionary / array
8.2 文本预处理
ASEMI三相整流桥和单相整流桥的详细对比
Explain TCP's three handshakes in detail
MySQL error packet out of order
The art of automation
你还不知道责任链模式的使用场景吗?
随机推荐
I thought I could lie down and enter Huawei, but I was confused when I received JD / didi / iqiyi offers one after another
[servlet] detailed explanation of servlet (use + principle)
LeetCode153-寻找旋转排序数组中的最小值-数组-二分查找
Explanation and example application of the principle of logistic regression in machine learning
QT interface optimization: double click effect
【NLP】HMM隐马尔可夫+维特比分词
Model location setting in GIS data processing -cesium
在游戏世界组建一支AI团队,超参数的多智能体「大乱斗」开赛
【JZ46 把数字翻译成字符串】
LeetCode167-两数之和II-双指针-二分-数组-查找
Leetcode exercise - 396 Rotation function
Go basic reflection
MySQL error packet out of order
Find daffodils - for loop practice
8.5 循环神经网络简洁实现
你還不知道責任鏈模式的使用場景嗎?
【Proteus仿真】自动量程(范围<10V)切换数字电压表
Comment eolink facilite le télétravail
电容
Detailed explanation of C language P2 selection branch statement