tcc分布式事务(分布式事务xa和tcc优缺点)

作者:叶东福来源:别支喜鹊什么是TCC?TCC是Try,Confirm,Cancel的缩写。它最初是由Pat Helland在2007年发表的一篇题为“分布式交

作者:叶东福来源:别支喜鹊

tcc分布式事务(分布式事务xa和tcc优缺点)

什么是TCC?TCC是Try,Confirm,Cancel的缩写。它最初是由Pat Helland在2007年发表的一篇题为“分布式交易之外的生活:一个叛教者的观点”的论文中提出的。

TCC组成

TCC分为三个阶段。

Try 阶段:尝试执行,完成所有业务检查(一致性), 预留必须业务资源(准隔离性)Confirm 阶段:如果所有分支的Try都成功了,则走到Confirm阶段。Confirm真正执行业务,不作任何业务检查,只使用 Try 阶段预留的业务资源Cancel 阶段:如果所有分支的Try有一个失败了,则走到Cancel阶段。Cancel释放 Try 阶段预留的业务资源。

在TCC分布式事务中,有三个角色,就像经典的XA分布式事务一样:

AP/应用程序,发起全局事务,定义全局事务包含哪些事务分支RM/资源管理器,负责分支事务各项资源的管理TM/事务管理器,负责协调全局事务的正确执行,包括Confirm,Cancel的执行,并处理网络异常

如果要开展类似跨行转账的业务,TransOut和TransIn在不同的微服务。成功完成的TCC事务的典型序列图如下:

tcc分布式事务(分布式事务xa和tcc优缺点)

TCC网络异常

在TCC的整个全局事务处理过程中,可能会出现空回滚、幂等、挂起等各种网络异常。由于TCC的异常类似于SAGA、可靠消息等事务模式,我们把所有的异常解决方案放在本文“分布式事务的七个经典解决方案”的子事务屏障环节进行讲解。

TCC实践

让我们具体开发一下TCC事务。

目前可用于TCC的开源框架主要是Java语言,其中以seata为代表。我们的例子采用nodejs,使用的分布式事务框架是dtm,非常优雅地支持分布式事务。下面详细解释一下TCC的构成。

让我们编写一个具体的尝试/确认/取消处理程序。

router . post(& # 39;/API/TransOutTry & # 39;,(ctx,next)= & gt;{ console . log(& # 34;TransOutTry & # 34)CTX . body = { result:& # 34;成功& # 34;} }).帖子(& # 39;/API/TransOutConfirm & # 39;,(ctx,next)= & gt;{ console . log(& # 34;输出确认& # 34;)CTX . body = { result:& # 34;成功& # 34;} }).帖子(& # 39;/API/TransOutCancel & # 39;,(ctx,next)= & gt;{ console . log(& # 34;TransOutCancel & # 34)CTX . body = { result:& # 34;成功& # 34;} }).帖子(& # 39;/API/trans entry & # 39;,(ctx,next)= & gt;{ console . log(& # 34;暂时性& # 34;)CTX . body = { result:& # 34;成功& # 34;} }).帖子(& # 39;/API/TransInConfirm & # 39;,(ctx,next)= & gt;{ console . log(& # 34;TransInConfirm & # 34)CTX . body = { result:& # 34;成功& # 34;} }).帖子(& # 39;/API/transin cancel & # 39;,(ctx,next)= & gt;{ console . log(& # 34;TransInCancel & # 34)CTX . body = { result:& # 34;成功& # 34;}})每个子事务的处理函数OK,然后启动TCC事务,进行分支调用。

异步函数fire TCC(){ let DTM = & # 34;http://localhost:8080/API/DTM SVR & # 34;// dtm服务地址字母svc = & # 34http://localhost:4005/API & # 34;//本地服务前缀//启动tcc事务。在第二个参数中,编写逻辑await DTM CLI . tccglobaltransaction(DTM,async(t)= >;{let req = {amount: 30} //子事务console . log(& # 34;呼叫trans out & # 34)//注册事务分支,调用tryawait t.call分支(req,SVC+& # 34;/trans outtry & # 34;,SVC+& # 34;/TransOutConfirm & # 34;,SVC+& # 34;/TransOutCancel & # 34;)console . log(& # 34;呼叫trans in & # 34)//注册事务分支,调用tryawait t.call分支(req,SVC+& # 34;/trans entry & # 34;,SVC+& # 34;/TransInConfirm & # 34;,SVC+& # 34;/transin cancel & # 34;)}}}到目前为止,已经写了一个完整的TCC分布式事务。

如果想完整的运行一个成功的例子,参考这个例子yedf/dtmcli-node-sample,运行起来非常简单。

#部署启动dtm #需要docker版本18以上git clone https://github.com/yedf/dtm CD DTM Docker-Compose Up #启动另一个命令行git clone https://github.com/yedf/回滚DTM CLI-node-sample CD DTM CLI-node-sample NPM安装node.tcc如果银行向用户2转账,发现用户2账户异常,返回失败,会发生什么情况?我们给出了事务失败交互的序列图。

tcc分布式事务(分布式事务xa和tcc优缺点)

与成功的TCC不同的是,当一个子事务返回失败时,全局事务会在后面回滚,每个子事务的取消操作都会被调用,以保证所有的全局事务都会被回滚。

小结

本文介绍了TCC的理论知识,并通过一个实例给出了编写TCC事务的完整过程,包括正常的成功完成和成功回滚。相信读者通过这里的文章对TCC有了深入的了解。

关于分布式事务更多更全面的知识,请参考分布式事务七大经典解决方案。

本文使用的例子摘自yedf/dtm,支持多种事务模式:TCC、SAGA、XA,以及对事务消息的跨语言支持。已经支持golang、python、Java、PHP、nodejs等语言的客户端。请参考每种语言的SDK。提供子事务屏障功能,优雅地解决幂等、挂起、空补偿等问题。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/29751.html

发表回复

登录后才能评论