专栏首页分布式架构分布式架构设计篇(八)-柔性事务之TCC详解
原创

分布式架构设计篇(八)-柔性事务之TCC详解

TCC概念由Pat Helland于2007年发表的一篇名为《Life beyond Distributed Transactions:an Apostate’s Opinion》的论文提出, 在该论文中,TCC还是以Tentative-Confirmation-Cancellation命名。正式以Try-Confirm-Cancel作为名称的是Atomikos公司,并且还注册了TCC商标。国内最早可查引进TCC概念,应是阿里程立2008年在 软件开发2.0大会 上分享主题《大规模SOA系统中的分布事务处理》中。

Atomikos公司在商业版本事务管理器ExtremeTransactions中提供了TCC方案的实现,但是由于其是收费的,因此相应的很多的开源实现方案也就涌现出来,如:ByteTCC、Himly、TCC-transaction。但是笔者都不推荐使用,下文会详细说明。

- 组成 -

TCC 是一种补偿型事务,该模型要求应用的每个服务提供 try、confirm、cancel 三个接口,它的核心思想是通过对资源的预留(提供中间态,如账户状态、冻结金额等),尽早释放对资源的加锁,如果事务可以提交,则完成对预留资源的确认,如果事务要回滚,则释放预留的资源。

TCC模型完全交由业务实现,每个子业务都需要实现Try-Confirm-Cancel三个接口,对业务侵入大,资源锁定交由业务方。

  1. Try:尝试执行业务,完成所有业务检查(一致性),预留必要的业务资源(准隔离性)。
  2. Confirm:确认执行业务,不再做业务检查。只使用Try阶段预留的业务资源,Confirm操作满足幂等性。
  3. Cancel:取消执行业务释放Try阶段预留业务资源。

一个完整的业务活动由一个主业务服务与若干子业务服务组成:

  1. 主业务服务负责发起并完成整个业务活动
  2. 业务服务提供TCC型业务操作。
  3. 业务活动管理器控制业务活动的一致性,它登记业务活动中的操作,并在业务活动提交时确认所有的TCC型操作的Confirm操作,在业务活动取消时调用所有TCC型操作的Cancel操作。

成本:

  1. 实现TCC操作的成本
  2. 业务活动结束时Confirm或Cancel操作的执行成本。在Confirm和Cancel范围内的操作成功性需要框架来保证,只能一直重试保证资源被消耗或者释放。
  3. 业务活动日志成本

适用范围:

  1. 强隔离性、严格一致性要求的业务活动
  2. 适用于执行时间较短的业务
- TCC与2PC对比 -

TCC将事务提交划分成两个阶段,Try即为一阶段,Confirm 和 Cancel 是二阶段并行的两个分支,二选一。从阶段划分上非常像2PC,我们是否可以说TCC是一种2PC或者2PC变种呢?其实不可以,原因如下:

  1. 2PC的操作对象在于资源层,对于开发人员无感知;而TCC的操作在于业务层,具有较高开发成本。
  2. 2PC是一个整体的长事务,也是刚性事务;而TCC是一组的本地短事务,是柔性事务。
  3. 2PC的Prepare(表决阶段)进行了操作表决;而TCC的try并没有表决准备,直接兼备资源操作与准备能力
  4. 2PC是全局锁定资源,所有参与者阻塞 交互等待TM通知;而TCC的资源锁定在于Try操作,业务方可以灵活选择业务资源的锁定粒度。
- TCC注意事项 -

​TCC为了解决网络不可靠引起的异常情况,要求业务方在设计上要遵循三个策略:

  1. 允许空回滚:原因是异常发生在阶段一时,部分参与方没有收到 Try 请求从而触发整个事务的Cancel 操作;Try 失败或者没有执行 Try 操作的参与方收到 Cancel 请求时,要进行空回滚操作。
  2. 保持幂等性:原因是异常发生在阶段二时,比如网络超时,则会重复调用参与方的 Confirm/Cancel 方法,因此Confirm/Cancel方法必须保证幂等性。
  3. 防止资源悬挂:原因网络异常导致两个阶段无法保证严格的顺序执行,出现参与方侧 Try 请求比 Cancel 请求更晚到达的情况,Cancel 会执行空回滚而确保事务的正确性,但是此时 Try 方法也不可以再被执行。
- 案例 -

汇款服务、收款服务案例:A用户向B用户汇款500元。

- 总结 -

因为TCC对业务的强侵入性,使用成本非常昂贵,虽然提供了更灵活的资源锁粒度,对标2PC拥有更高的吞吐量。但是相对于2PC的强一致性来说,TCC的实施成本和数据一致性的牺牲带来的相对高吞吐量,总体表现出来的性价比非常低,反而在市面上成熟的大型企业中几乎没有使用。

- 作者介绍 -

孙玄

毕业于浙江大学,奈学教育创始人兼CEO,前转转公司技术委员会主席,前58集团技术委员会主席,前百度资深研发工程师,腾讯云TVP,阿里云MVP,在线直播大课《百万架构师》品牌创始人。

林淮川

毕业于西安交通大学;奈学教育《百万架构师训练营》讲师及企业级源码内源负责人,前大树金融高级架构师、技术委员会开创者、技术总监;前天阳宏业交易事业部技术主管;多年互联网金融行业(ToB)经验。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 分布式架构设计篇(四)-聊聊cap

    CAP理论,被戏称为“帽子理论”,CAP是Eric Brewer在2000年ACM研讨会上出了一个想法:“一致性、可用性和分区容错性三者无法在分布式系统中被同时...

    林淮川
  • 分布式架构设计篇-一致性算法概述

    提到一致性这个词,大家会想到外文中有几个单词,如CAP中的Consistency、Cache Coherence、区块链的Consensus。这三个单词在外文...

    林淮川
  • 一致性算法 - Raft协议总述

    Raft协议起源于 2013 年 斯坦福 Diego Ongaro和John Ousterhout的论文《In Search of an Understanda...

    林淮川
  • Docker笔记

    1.创建空文件夹 假设新建一个名为wordpress的文件夹,然后进入这个文件夹。

    hankleo
  • 【php增删改查实例】第十五节 - 用户管理模块(用户列表格式化)1.对是否删除进行格式化2.对密码进行格式化3.用户恢复和删除操作

    剽悍一小兔
  • 『中级篇』docker容器安装wordpress(37)

    PS:大家想一想,类似这种的应用可能需要2个,也有可能需要3个4个,这样的操作是不是很繁琐,我们的希望这样的多个容器形式一个组group,统一化管理,一起安装,...

    IT故事会
  • Mysql-12-mysql的备份和恢复

    1.数据库的备份   备份=拷贝加管理,防止数据的丢失同时记录用户的操作记录。其中最有效的备份是对IT架构进行备份。 原则: (1)数据库要定期备份,备份的周期...

    用户1173509
  • mysql的if用法解决同一张数据表里面两个字段是否相等统计数据量。

    MySQL的使用用法如下所示: 格式:if(Condition,A,B) 意义:当Condition为true时,返回A;当Condition为false时,返...

    别先生
  • shell脚本备份mysql数据库

    第一种方法: #!/bin/sh # 备份数据库 # Mysql 用户名密码 MYSQL_USER=root MYSQL_PASS=root BACKU...

    老七Linux
  • QUIC协议的分析,性能测试以及在QQ会员实践

    原文链接:http://wetest.qq.com/lab/view/384.html

    WeTest质量开放平台团队

扫码关注云+社区

领取腾讯云代金券