seata 如何开启tcc事物_微服务分布式事务4种解决方案实战

分布式事务

分布式事务是指事务的参与者,支持事务的服务器,资源服务器分别位于分布式系统的不同节点之上,通常一个分布式

事物中会涉及到对多个数据源或业务系统的操作。

典型的分布式事务场景:跨银行转操作就涉及调用两个异地银行服务

CAP理论

CAP理论:一个分布式系统不可能同时满足一致性,可用性和分区容错性这个三个基本需求,最多只能同时满足其中两

一致性(C):数据在多个副本之间是否能够保持一致的特性。

可用性(A):是指系统提供的服务必须一致处于可用状态,对于每一个用户的请求总是在有限的时间内返回结果,超过时

间就认为系统是不可用的

分区容错性(P):分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务,

除非整个网络环境都发生故障。

CAP定理的应用

放弃P(CA):如果希望能够避免系统出现分区容错性问题,一种较为简单的做法就是将所有的数据(或者是与事物先相关

的数据)都放在一个分布式节点上,这样虽然无法保证100%系统不会出错,但至少不会碰到由于网络分区带来的负面影

放弃A(CP):其做法是一旦系统遇到网络分区或其他故障时,那受到影响的服务需要等待一定的时间,应用等待期间系统

无法对外提供正常的服务,即不可用

放弃C(AP):这里说的放弃一致性,并不是完全不需要数据一致性,是指放弃数据的强一致性,保留数据的最终一致性。

BASE理论

BASE是基本可用,软状态,最终一致性。是对CAP中一致性和可用性权限的结果,是基于CAP定理演化而来的,核心思

想是即使无法做到强一致性,但每个应用都可以根据自身的业务特定,采用适当的方式来使系统达到最终一致性

2PC提交

二阶段提交协议是将事务的提交过程分成提交事务请求和执行事务提交两个阶段进行处理。

阶段一:提交事务请求

事务询问:协调者向所有的参与者发送事务内容,询问是否可以执行事务提交操作,并开始等待各参与者的响应

执行事务:各参与者节点执行事务操作,并将Undo和Redo信息记入事务日志中

如果参与者成功执事务操作,就反馈给协调者Yes响应,表示事物可以执行,如果没有成功执行事务,就反馈给协调者

No响应,表示事务不可以执行

二阶段提交一些的阶段一夜被称为投票阶段,即各参与者投票票表明是否可以继续执行接下去的事务提交操作

阶段二:执行事务提交

假如协调者从所有的参与者或得反馈都是Yes响应,那么就会执行事务提交。

发送提交请求:协调者向所有参与者节点发出Commit请求

事务提交:参与者接受到Commit请求后,会正式执行事务提交操作,并在完成提交之后放弃整个事务执行期间占用的

事务资源

反馈事务提交结果:参与者在完成事物提交之后,向协调者发送ACK消息

完成事务:协调者接收到所有参与者反馈的ACK消息后,完成事务

中断事务

假如任何一个参与者向协调者反馈了No响应,或者在等待超市之后,协调者尚无法接收到所有参与者的反馈响应,那么

就中断事务。

发送回滚请求:协调者向所有参与者节点发出Rollback请求

事务回滚:参与者接收到Rollback请求后,会利用其在阶段一种记录的Undo信息执行事物回滚操作,并在完成回滚之

后释放事务执行期间占用的资源。

反馈事务回滚结果:参与则在完成事务回滚之后,向协调者发送ACK消息

中断事务:协调者接收到所有参与者反馈的ACk消息后,完成事务中断、

优缺点

原理简单,实现方便

缺点是同步阻塞,单点问题,脑裂,保守

3PC提交

三阶段提,也叫三阶段提交协议,是二阶段提交(2PC)的改进版本。

与两阶段提交不同的是,三阶段提交有两个改动点。引入超时机制。同时在协调者和参与者中都引入超时机制。在第一

阶段和第二阶段中插入一个准备阶段。保证了在最后提交阶段之前各参与节点的状态是一致的。

三阶段提交就有CanCommit、PreCommit、DoCommit三个阶段。

Seata分布式事务方案

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了

AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

Seata术语

TC:事务协调者。维护全局和分支事务的状态,驱动全局事务提交或回滚。

TM:事务管理器。定义全局事务的范围:开始全局事务、提交或回滚全局事务

RM:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

Seata的2PC方案

一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。

二阶段:提交异步化,非常快速地完成。回滚通过一阶段的回滚日志进行反向补偿。

一阶段本地事务提交前,需要确保先拿到 全局锁 。拿不到全局锁 ,不能提交本地事务。

拿全局锁的尝试被限制在一定范围内,超出范围将放弃,并回滚本地事务,释放本地锁。

在数据库本地事务隔离级别读已提交或以上的基础上,Seata(AT 模式)的默认全局隔离级别是 读未提交

如果应用在特定场景下,必需要求全局的 读已提交 ,目前 Seata 的方式是通过 SELECT FOR UPDATE 语句的代理。

Seata执行流程分析

每个RM使用DataSourceProxy链接数据路,目的是使用ConnectionProxy,使用数据源和数据代理的目的是在第一阶段

将undo_log和业务数据放在一个本地事务提交,这样就保存了只要有业务操作就一定有undo_log

在第一阶段undo_log中存放了数据修改前后修改后的值,为事务回滚做好准别,所以第一阶段完成就已经将分支事务提

交了,也就释放了锁资源

TM开启全局事务开始,将XID全局事务ID放在事务上下文中,通过feign调用也将XID传入下游分支事务,每个分支事务

将自己的Branch ID 分支事务ID与XID关联

第二阶段全局事务提交,TC会通知各分支参与者提交分支事务,在第一阶段就已经提交了分支事务,这里各参与者只需

要删除undo_log即可,并且可以异步执行,第二阶段很快可以完成

如果某一个分支事务异常,第二阶段就全局事务回滚操作,TC会通知各分支参与者回滚分支事务,通过XID和

Branch-ID找到对应的回滚日志,通过回滚日志生成的反向SQL并执行,以完成分支事务回滚到之前

Seata的实战案列

github.com/seata/seata…

github.com/seata/seata…

TCC分布式事务

TCC是服务化的两阶段编程模型,其Try、Confirm、Cancel,3个方法均由业务编码实现

TCC要求每个分支事务实现三个操作:预处理Try,确认Confirm,撤销Cancel。

Try操作做业务检查及资源预留,

Confirm做业务确认操作

Cancel实现一个与Try相反的操作即回滚操作。

TM首先发起所有的分支事务Try操作,任何一个分支事务的Try操作执行失败,TM将会发起所有分支事务的Cancel操作,

若Try操作全部成功,TM将会发起所有分支事务的Confirm操作,其中Confirm/Cancel操作若执行失败,TM会进行重试。

TCC的三个阶段

Try阶段是做业务检查(一致性)及资源预留(隔离),此阶段仅是一个初步操作,它和后续的Confirmy一起才能构成一个完整

的业务逻辑

Confirm阶段是做确认提交,Try阶段所有分支事务执行成功后开始执行Confirm,通常情况下,采用TCC则认为

Confirm阶段是不会出错的,即:只要Try成功,Confirm一定成功,若Confirm阶段真的出错,需要引入重试机制或人工

处理

Cancel阶段是在业务执行错误需要回滚到状态下执行分支事务的取消,预留资源的释放,通常情况下,采用TCC则认为

Cancel阶段也一定是真功的,若Cance阶段真的出错,需要引入重试机制或人工处理

TM事务管理器:TM事务管理器可以实现为独立的服务,也可以让全局事务发起方充当TM的角色,TM独立出来是为了公

用组件,是为了考虑系统结构和软件的复用

TM在发起全局事务时生成全局事务记录,全局事务ID贯穿整个分布式事务调用链条,用来记录事务上下文,追踪和记录

状态,用于Confirm和cacel失败需要进行重试,因此需要实现幂等

TCC的三种异常处理情况

幂等处理

因为网络抖动等原因,分布式事务框架可能会重复调用同一个分布式事务中的一个分支事务的二阶段接口。所以分支事务

的二阶段接口Confirm/Cancel需要能够保证幂等性。如果二阶段接口不能保证幂等性,则会产生严重的问题,造成资源

的重复使用或者重复释放,进而导致业务故障。

对于幂等类型的问题,通常的手段是引入幂等字段进行防重放攻击。对于分布式事务框架中的幂等问题,同样可以祭出

这一利器。

幂等记录的插入时机是参与者的Try方法,此时的分支事务状态会被初始化为INIT。然后当二阶段的Confirm/Cancel执行

时会将其状态置为CONFIRMED/ROLLBACKED。

当TC重复调用二阶段接口时,参与者会先获取事务状态控制表的对应记录查看其事务状态。如果状态已经为

CONFIRMED/ROLLBACKED,那么表示参与者已经处理完其分内之事,不需要再次执行,可以直接返回幂等成功的结果

给TC,帮助其推进分布式事务。

空回滚

当没有调用参与方Try方法的情况下,就调用了二阶段的Cancel方法,Cancel方法需要有办法识别出此时Try有没有执行。如果Try还没执行,表示这个Cancel操作是无效的,即本次Cancel属于空回滚;如果Try已经执行,那么执行的是正常的回滚逻辑。

要应对空回滚的问题,就需要让参与者在二阶段的Cancel方法中有办法识别到一阶段的Try是否已经执行。很显然,可以

继续利用事务状态控制表来实现这个功能。

当Try方法被成功执行后,会插入一条记录,标识该分支事务处于INIT状态。所以后续当二阶段的Cancel方法被调用时,

可以通过查询控制表的对应记录进行判断。如果记录存在且状态为INIT,就表示一阶段已成功执行,可以正常执行回滚操

作,释放预留的资源;如果记录不存在则表示一阶段未执行,本次为空回滚,不释放任何资源。

资源悬挂

问题:TC回滚事务调用二阶段完成空回滚后,一阶段执行成功

解决:事务状态控制记录作为控制手段,二阶段发现无记录时插入记录,一阶段执行时检查记录是否存在

TCC和2PC比较

2PC通常都是在跨库的DB层面,而TCC则在应用层面处理,需要通过业务逻辑实现,这种分布式事务的实现方式优势在

于,可以让应用自己定义数据操作的粒度,使得降低锁冲突,提高吞吐量成为可能

而不足之处则在于对应用的侵入性非常强,业务逻辑的每个分支都需要实现Try,confirm,cancel三个操作。此外,其实

现难度也比较大,需要按照网络状态,系统故障的不同失败原因实现不同的回滚策略

Hmily框架实现TCC案列

# 账户A

try:

try的幂等效验

try的悬挂处理

检查余额是否够30元

扣减30元

confirm:

空处理即可,通常TCC阶段是认为confirm是不会出错的

cancel:

cancel幂等效验

cacel空回滚处理

增加可用余额30元,回滚操作

# 账户B

try:

空处理即可

confirm:

confirm的幂等效验

正式增加30元

cancel:

空处理即可

RocketMQ实现可靠消息最终一致性

可靠消息最终一致性就是保证消息从生产方经过消息中间件传递到消费方的一致性

RocketMQ主要解决了两个功能:本地事务与消息发送的原子性问题。事务参与方接收消息的可靠性

可靠消息最终一致性事务适合执行周期长且实时性要求不高的场景,引入消息机制后,同步的事务操作变为基于消息执行

的异步操作,避免分布式事务中的同步阻塞操作的影响,并实现了两个服务的解耦

最大努力通知

最大努力通知与可靠消息一致性有什么不同

可靠消息一致性,发起通知方需要保证将消息发出去,并且将消息发送到接收通知方,消息的可靠性由发起通知方保证

最大努力通知,发起通知方尽最大的努力将业务处理结果通知为接收通知方,但是消息可能接收不到,此时需要接收通知

方主动调用发起通知方的接口查询业务,通知可靠性关键在于接收通知方

两者的应用场景

可靠消息一致性关注的是交易过程的事务一致,以异步的方式完成交易

最大努力通知关注的是交易后的通知事务,即将交易结果可靠的通知出去

基于MQ的ack机制实现最大努力通知

利用MQ的ack机制由MQ向接收通知方发送消息通知,发起方将普通消息发送到MQ

接收通知监听MQ,接收消息,业务处理完成回应ACK

接收通知方如果没有回应ACK则MQ会重复通知,按照时间间隔的方式,逐步拉大通知间隔

此方案适用于内部微服务之间的通知,不适应与通知外部平台

方案二:增加一个通知服务区进行通知,提供外部第三方时适用

分布式事务方案对比分析

2PC 最大的一个诟病是一个阻塞协议。RM在执行分支事务后需要等待TM的决定,此时服务会阻塞锁定资源。由于其阻

塞机制和最差时间复杂度高,因此,这种设计不能适应随着事务涉及的服务数量增加而扩展的需要,很难用于并发较高以

及子事务生命周期较长的分布式服务中

如果拿TCC事务的处理流程与2PC两阶段提交做比较,2PC通常都是在跨库的DB层面,而TCC则在应用层面处理,需要通

过业务逻辑来实现。这种分布式事务的优势在于,可以让应用自定义数据操作的粒度,使得降低锁冲突,提高吞吐量成为

可能。而不足之处在于对应用的侵入性非常强,业务逻辑的每个分支都需要实现三个操作。此外,其实现难度也比较大,

需要按照网络状态,系统故障等不同失败原因实现不同的策略。

可靠消息最终一致性事务适合执行周期长且实时性要求不高的场景。引入消息机制后,同步的事务操作变为基于消息执行

的异步操作,避免了分布式事务中的同步阻塞操作的影响,并实现了两个服务的解耦,典型的场景:注册送积分,登陆送

优惠券等

最大努力通知是分布式事务中要求最低的一种,适用于一些最终一致性时间敏感度低的业务,允许发起通知方业务处理失

败,在接收通知方收到通知后积极进行失败处理,无论发起通知方如何处理结果都不会影响到接收通知方的后续处理,发

起通知方需提供查询执行情况接口,用于接收通知方校对结果,典型的应用场景:银行通知,支付结果通知等。

2PC

TCC

可靠消息

最大努力通知

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

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

相关文章

python redis 哨兵_Redis哨兵机制

概述上篇文章主要说了Redis 复制的内容,但 Redis 复制有一个缺点,当主机 Master 宕机以后,我们需要人工解决切换,比如使用slaveof no one 。实际上主从复制并没有实现,高可用, 高可用侧重备份机器&#xff…

labview自动生成html,使用LabVIEW实现网页数据提取及交互.pptx

使用 LabVIEW 控制IE或WebBrowser实现网页数据的提取和交互By GSD:attraction - 张生斌2013.1.11可能会遇到的问题网页能否被程序控制,程序和网页如何通信?如何下载网页中我们所关注的数据?如何用程序修改网页中表单的内容&#x…

pdf python定位_如何使用PyPDF2获取PDF定位

我正在使用Python/Django。PyPDF2阅读我目前的pdf。如何使用PyPDF2获取PDF定位我想阅读我已经保存的pdf文件,并获得pdf内单页的方向。我期望能够确定页面是横向还是纵向。tempoutpdffilelocation settings.TEMPLATES_ROOT nameOfFinalPdfpageOrientation pageToE…

android 内容显示栏,android – 在工具栏下显示内容

您好我试图简单地将我的内容放在工具栏下面,但是当我运行我的应用程序时,当它应该低于它时,一些内容隐藏在它后面.我已经阅读了关于使用框架布局来尝试将其分开但我已经陷入困境.我目前正在使用随软件提供的基本android studio导航抽屉模板,并想知道我必须做出哪些更改.我的协调…

ios nslog 例子_iOS 典型内存泄露案例 - zhenshan2013的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

最近进行iOS 安全黑匣子的测试,在Demo中通过不断的点击调加密接口,同时通过苹果自带instrument的leak工具监控,发现典型的内存泄漏,监控图如下:上图中红色的部分表示该操作触发的代码有内存泄漏的可能,于是拿出源代码来研究一番,源代码如下://加密接口-(IBAction)encrypt:(id)s…

HTML饼状图中心添加文字,echarts饼状图环形中间动态文字

let currName "";let myChart echarts.getInstanceByDom(document.getElementById(‘chart-panel‘));//console.log(myChart);myChart.on(‘mouseover‘, (params) >{currNameparams.name;console.log(params)let opmyChart.getOption();let _label{normal:{sho…

pos共识机制_OK区块链60讲 | 第17集:什么是PoS共识机制

什么是PoS共识机制https://www.zhihu.com/video/1196092110837805056《OK区块链60讲》是由OKEx&新浪科技联合出品的区块链科普动画视频,针对区块链零基础用户,通过系列文章、科普动画等形式,从概念、技术、应用等角度,…

html溢出左右滚动,html-选项卡溢出时水平滚动

我在容器中有一个基本表。 该表将包含约25列。 我正在尝试在表格溢出时添加水平滚动条,现在过得很艰难。现在正在发生的情况是,表格单元格通过自动调整单元格的高度并保持固定的表格宽度来容纳单元格的内容。对于我的方法为何无法解决此问题的建议&#…

大疆无人机android登录闪退,你的DJI APP闪退了吗?附官方解决方案

原标题:你的DJI APP闪退了吗?附官方解决方案今天,很多飞友反应,在使用大疆无人机过程中出现DJI APP闪退情况。随后在大疆社区官方给出了解决方案,如下:关于DJI GO 4 APP闪退解决方案目前关于DJI GO4 APP闪退…

ps导出gif颜色不对_PS基础知识(1)

视图平移命令:1,使用工具箱中的抓手工具或着(H)2按住空格键,上下左右移动视图。(常用方法)图像格式PSD:原始的图像文件,包含所有的 Photoshop 处理信息,如图层&#xff0…

html如何设置鼠标选中状态,怎么用CSS 设置 当鼠标移动到菜单时,该按钮变色,鼠标点击后,页面停留在鼠标滑过时的状态!!很急!...

用javascript就可以,基本代码在下面,你自己照着改吧htmlheadmeta http-equivContent-Type contenttext/html;charset gb2312 //headbodyscript typetext/javascriptfunction changeA(){document.getElementById(menuA).style.background#f00;document.g…

python中难的算法_Python算法很难吗?python神书《算法图解》PDF电子版分享给你

许多小伙伴后台私信说,python算法让自己很头疼,有没有可以让算法像小说一样有趣的书籍资料呢?看这里吧!小宋为大家找到了这本《算法图解》的PDF电子版!让你在学习python的路上变得轻松有趣!内 容 提 要本书…

音乐分享 html,支付宝朋友圈可以分享音乐嘛

打开手机,找到手机里面的支付宝应用点击进入在进入的支付宝界面里,选择底下的朋友点击进入在弹出的朋友界面选择生活圈选择生活圈下方的朋友动态进到朋友动态界面,点击右上角的照相机图标支付宝 怎么发朋友圈动态?进入支付宝页面中…

eplan单线原理图多线原理图_EPLAN-黑盒-2

3、黑盒的功能定义制作完成的黑盒仅仅图形化描述了一个变频器,它实现逻辑上的智能了吗?双击黑盒弹出属性标签,它的主标签还是现实黑盒,如图,图形和逻辑还没匹配。因此,必须为它重新定义功能。EPLAN的功能定…

html图片热点新窗口,HTML基础必看---表单,图片热点,网页划区和拼接详解

html表单里面的图片点击相应图片跳转到本页其他去在表格里面选了这个 鼠标点击一下跳转到相应区块 代码要怎么写,夜影驱动编程小编今天和大家分享大神需要在一张图片上设置多个能点击跳转的链接区域时,推荐使用网页的热点链接。 参考代码如下&#xff1a…

ios 点击出现另外一套tabbar_IOS 点击tabbaritem跳转到一个新界面,且隐藏tabbar

先自定义一个UITabbarController,用于Storyboard中再在MyTabbarController中实现protocolinterface MyTabbarController : UITabBarController end再实现代理里面的方法implementation MyTabbarController- (BOOL)tabBarController:(UITabBarController *)tabBarCon…

viewpage 去掉左右切换效果_ViewPager实现多页面切换以及动画效果

作者写的非常详细,在此赞一下。尤其画图示意计算。常看代码不知coder数字的含义,看此博文无此感。我只在此列出流程和需要注意的点。步骤1:导入android-support-v4.jar包两种方法(升级到adt17 后需要注意的问题)a, 新建libs文件夹…

获取html内标题,通过html敏捷包获取标题标签

我正在尝试使用htmlagility pack来获得结果的链接和结果我有这个代码using HtmlAgilityPack;using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.IO;using System.Linq;using System.Net;using …

html视频播放div,打造自己的html5视频播放器

推荐这篇文章遇新是直朋能到:前段时间重新少端原码动近基开创学画近基开创学画近基开学习了一下html5的video部分,以前只是停留在标签的使用上,这一次决定深入了解相关的API,并运用这些API打造一个简单的视频播放器。所谓“打造自…

wpf 代码获取contextmenu_[C#] 转:在WPF里面获取右键弹出菜单(ContextMenu)的鼠标点击源(Owner)控件...

WPF的ContextMenu没有类似WinForm里面ContextMenu.SourceControl的概念,但是你可以通过ContextMenuService的GetPlacementTarget方法来获取类似的效果。很多时候,我们会希望在WPF的资源文件里面定义一个通用的右键弹出菜单,然后将这个菜单通过…