黑马程序员技术交流社区

标题: [杭州校区][技术笔记] 补偿型分布式事务TCC [打印本页]

作者: 小江哥    时间: 2018-4-28 09:20
标题: [杭州校区][技术笔记] 补偿型分布式事务TCC
本帖最后由 小江哥 于 2018-4-28 09:23 编辑

原文点击此处


在当前如火如荼的互联网浪潮下,如何应对海量数据、高并发成为大家面临的普遍难题。广大IT公司从以往的集中式网站架构,纷纷转向分布式的网站架构,随之而来的就是进行数据库拆分和应用拆分,如何在跨数据库、跨应用保证数据操作和业务操作的一致性、原子性,又成为需要解决的新的问题。从分布式事务的需求来源来看:
1、跨数据库

2、跨应用

跨应用的业务操作原子性要求,其实是比较常见的。比如在第三方支付场景中的组合支付,用户在电商网站购物后,要同时使用余额和红包支付该笔订单,而余额系统和红包系统分别是不同的应用系统,支付系统在调用这两个系统进行支付时,就需要保证余额扣减和红包使用要么同时成功,要么同时失败。

TCC事务的出现正是为了解决应用拆分带来的跨应用业务操作原子性的问题。当然,由于常规的XA事务(2PC,2 Phase Commit, 两阶段提交)性能上不尽如人意,也有通过TCC事务来解决数据库拆分的使用场景(如账务拆分),这个本文后续部分再详述。

故从整个系统架构的角度来看,分布式事务的不同方案是存在层次结构的:


TCC的机制

明眼一看就知道,TCC应该是三个英文单词的首字母缩写而来。没错,TCC分别对应Try、Confirm和Cancel三种操作,这三种操作的业务含义如下:

       稍稍对照下关系型数据库事务的三种操作:DML、Commit和Rollback,会发现和TCC有异曲同工之妙。在一个跨应用的业务操作中,Try操作是先把多个应用中的业务资源预留和锁定住,为后续的确认打下基础,类似的,DML操作要锁定数据库记录行,持有数据库资源;Confirm操作是在Try操作中涉及的所有应用均成功之后进行确认,使用预留的业务资源,和Commit类似;而Cancel则是当Try操作中涉及的所有应用没有全部成功,需要将已成功的应用进行取消(即Rollback回滚)。其中Confirm和Cancel操作是一对反向业务操作。


简而言之,TCC是应用层的2PC(2 Phase Commit, 两阶段提交),如果你将应用看做资源管理器的话。       详细来说,TCC每项操作需要做的事情如下:1、Try:尝试执行业务。2、Confirm:确认执行业务。3、Cancel:取消执行业务

       用一张图来说明TCC的机制:


一个完整的TCC事务参与方包括三部分:

       可见整个TCC事务对于主业务服务来说是透明的,其中业务活动管理器和从业务服务各自干了一部分工作。



TCC的优点和限制


TCC事务的优点如下:

       TCC事务的缺点,主要就一个:

       当然,对TCC事务的这个缺点是否是缺点,是一个见仁见智的事情。



一个案例理解

TCC说实话,TCC的理论有点让人费解。故接下来将以账务拆分为例,对TCC事务的流程做一个描述,希望对理解TCC有所帮助。       账务拆分的业务场景如下,分别位于三个不同分库的帐户A、B、C,A和B一起向C转帐共80元:

1、Try:尝试执行业务。
2、Confirm:确认执行业务。
3、Cancel:取消执行业务
小结:到底要不要使用TCC到底要不要使用TCC事务,取决于以下几点:

       一个问题,如果TCC事务在Try阶段所有参与方(从业务服务)成功了,但是Confirm阶段部分参与方(从业务服务)成功,如何处理?


TCC参考资料

《大规模SOA系统中的分布式事务处理》:蚂蚁金服CTO程立早年的一篇关于分布式事务的PPT,里面有关于大规模SOA系统中包括TCC在内的各种分布式事务处理方案,是支付宝在分布式事务实践的经验精华。

《Atomic Distributed Transactions: a RESTful Design》:ATOMIKOS公司的Guy Pardon和另一位作者一同写的一篇关于TCC事务设计方案的论文,对TCC的实现细节描述较为清楚。





作者: Yin灬Yan    时间: 2018-4-28 14:02
我来占层楼啊   




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2