• 104157

    文章

  • 803

    评论

  • 12

    友链

  • 比来新加了换肤功能,大年夜家多来走走吧~~~~
  • 爱好这个网站的同伙可以加一下QQ群,我们一路交换技巧。

分布式事务之TCC事务

撸了本年阿里、腾讯和美团的面试,我有一个重要发明.......>>

TCC 事务简介

在08年的软件开辟2.0技巧大年夜会上,付出宝程立在PPT大年夜范围SOA体系中的分布事务处理,提出TCC概念。 在搜集上搜刮分布式事务相干的博客,根本都邑说起这个PPT,今朝很多分布式事务开源项目也都是基于TCC的思维完成。

TCC 将事务提交分为 Try - Confirm - Cancel 3个操作。

  • Try:预留营业资本/数据效验
  • Confirm:确认履行营业操作
  • Cancel:撤消履行营业操作

TCC事务处理流程和 2PC 二阶段提交类似,不过 2PC平日都是在跨库的DB层面,而TCC本质就是一个应用层面的2PC。


TCC道理图,图片来自阿里公众号文章

TCC 优缺点

TCC长处:让应用本身定义数据库操作的粒度,使得降低锁抵触、进步吞吐量成为能够。

TCC缺乏的地方:

  • 对应用的侵入性强。营业逻辑的每个分支都须要完成try、confirm、cancel三个操作,应用侵入性较强,改革本钱高。
  • 完成难度较大年夜。须要按照搜集状况、体系毛病等不合的掉败缘由完成不合的回滚战略。为了满足分歧性的请求,confirm和cancel接口必须完成幂等。

TCC 事务应用处景

我们经过过程用户下单应用余额+红包付出来看一下TCC事务的详细应用。

假定用户下单操作来自3个体系下单体系、资金账户体系、红包账户体系,下单成功须要同时调用资金账户办事和红包办事完成付出

假定购买商品1000元,应用账户红包200元,余额800元,确认付出。

  • Try操作
    tryX 下单体系创建待付出订单
    tryY 解冻账户红包200元
    tryZ 解冻资金账户800元

  • Confirm操作
    confirmX 订单更新为付出成功
    confirmY 扣减账户红包200元
    confirmZ 扣减资金账户800元

  • Cancel操作
    cancelX 订单处理异常,资金红包退回,订单付出掉败
    cancelY 解冻红包掉败,账户余额退回,订单付出掉败
    cancelZ 冻节余额掉败,账户红包退回,订单付出掉败

TCC 开源项目实战 tcc-transaction

tcc-transaction 是TCC型事务Java完成,tcc-transaction和睦底层应用的rpc框架耦合,也就是应用doubbo,thrift,web service,http等都可以
起首感激开源作者忘我贡献,顺手star、fork下。

在 tcc-transaction 事例中有dubbo、http完成,在这里我们应用dubbo事例。

事例的详细功能,其实就是下面简介的 下单应用余额+红包付出。

tcc-transaction 事务管理器日记耐久化支撑多种方法

援用官方1.2指南解释:tcc-transaction框架应用transactionRepository耐久化事务日记。可以选择FileSystemTransactionRepository、SpringJdbcTransactionRepository、RedisTransactionRepository或ZooKeeperTransactionRepository。

我们这里演示应用SpringJdbcTransactionRepository,存储到MySQL

1. 项目预备

假定本地情况MySQL、Zookeeper都曾经预备终了

应用IDEA,将项目克隆到本地

我们应用的实例为tcc-transaction-dubbo-sample

  • tcc-transaction-dubbo-capital 资金账户dubbo办事
  • tcc-transaction-dubbo-capital-api 资金账户dubbo接口定义
  • tcc-transaction-dubbo-order 下单体系
  • tcc-transaction-dubbo-redpacket 红包账户dubbo办事
  • tcc-transaction-dubbo-redpacket-api 红包账户dubbo接口定义

履行数据库脚本: tcc-transaction\tcc-transaction-tutorial-sample\src\dbscripts\create_db_cap.sql (资金账户)

tcc-transaction\tcc-transaction-tutorial-sample\src\dbscripts\create_db_ord.sql (订单库)

tcc-transaction\tcc-transaction-tutorial-sample\src\dbscripts\create_db_red.sql (红包账户)

tcc-transaction\tcc-transaction-tutorial-sample\src\dbscripts\create_db_tcc.sql (事务日记耐久化)

修改项目设备: Zookeeper 设备

zookeeper.address=127.0.0.1:2181

假设非默许设备,须要将tcc-transaction-dubbo-sample 下的模块全部修改

JDBC连接设备:

jdbc.driverClassName=com.mysql.jdbc.Driver
tcc.jdbc.url=jdbc:mysql://127.0.0.1:3306/TCC?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
jdbc.username=root
jdbc.password=

假设非默许设备,须要将tcc-transaction-dubbo-sample,tcc-transaction-sample-domain 下项目模块修改

2. 项目发布

实例今朝都是应用的Tomcat发布,我们先安排Tomcat:

办事全部启动成功:


3. 多种事务场景测试

  • 第一种情况:红包账户解冻成功(try)、资金账户解冻成功(try),订单操作异常(try)

模仿异常代码:


购买成果:


此时订单付出掉败,红包账户解冻金额、资金账户解冻金额全部退回。
经过过程多种类似方法测试,例如:红包账户解冻异常、资金账户解冻异常,都邑调cancel,退回解冻资本。所以在try阶段的随便任性一方异常,都邑履行全局回滚。

  • 第二种情况:订单处理成功(confirm),资金账户扣减成功(confirm),但红包账户扣减掉败(confirm)

模仿异常代码,在红包扣减 confirm 操作制造异常:


购买成果:


此时订单为付出成功,但实际红包金额还处在解冻状况,事务管理器记录订单confirm操作未履行成功,体系会赓续重试调用订单的confirm操作,直到红包扣减成功。

手动将红包办事异常代码去掉落,重启办事,比及下一次重试,红包解冻金额被扣除成功。

  • 第三种情况: 资金账户解冻成功(try),红包账户解冻成功(try),订单处理掉败(confirm)

模仿异常代码,在订单 confirm 操作制造异常:


购买成果:


此时订单付出成功,但实际资金账户解冻金额、红包解冻金额都还没有扣除成功,事务管理器记录订单confirm操作未履行成功,体系会经过过程赓续重试订单的confirm操作,直到资金账户和红包账户扣减成功。

手动将异常代码去掉落,重启办事,比及下一次重试,红包和资金账户解冻金额被扣除。

  • 第四种情况:在第一种情况下,订单cancel操作处理掉败(cancel)

模仿异常代码,在第一种情况下基本,在cancel操作上在制造异常:

购买成果:


此时订单付出掉败,资金账户、红包账户解冻成功,事务管理器记录订单cancel操作掉败,体系会赓续重试订单的cancel操作,直到资金账户和红包账户解冻金额退回账户。

手动将异常代码去掉落,重启办事,下一次重试cancel操作,资金账户和红包账户解冻金额退回。

总结: try 操作成功,进入 confirm 操作,只需 confirm 处理掉败(不论是调和者挂了,照样参与者处理掉败或超时),体系经过过程赓续重试直到处理成功。 进入 cancel 操作也是一样,只需 cancel 处理掉败,体系经过过程赓续重试直到处理成功。

援用一段对话,详细解释TCC应用处景,和和2PC比较

成绩

  1. 关于转账的cancel事务,相对简单,只需把账务冲负便可。可普通的营业逻辑会触及很多流程、单证等操作,特别是汗青体系,应当很难改革成tcc构造的吧,不知道你们用tcc用在甚么场景下?
  2. 我第一次是在付出宝架构师程立PPT入耳说tcc构造的,不知道你的完成跟阿里系的完成是甚么关系,今朝应用的范围大年夜吗?
  3. 我懂得try法式榜样完成后,急速提交try事务,不会有锁事务竞争。可这个时辰账户余额的状况也被设置成了类似弗成读的状况吧,依然弗成以在其他营业中查询账户余额,那么这类筹划比2PC优势详细在甚么处所?

答复

  1. 我的感到TCC是比较合适具有较强分歧性请求的场景,账务体系就是如许场景;应用TCC也有必定的开辟本钱,假设没有强分歧性请求,可以推敲其他补偿型筹划;
  2. 今朝已应用在线下情况多个应用,重要就是应用账务体系里应用;由于不是开源的,我没有看过阿里的完成,部分自创了他们的思路;欲望无机会能看看;
  3. 在Try停止后,账户余额会有部分资金解冻,其他营业弗成以应用解冻资金;和2PC比较的话,懂得上去有两点:
  • 2PC是基于资本层(如数据库),TCC是基于SOA办事
  • 2PC是是用全局事务,数据被lock的时间跨全部事务,直到全局事务停止;而TCC里每个对资本操作的是本地事务,数据被lock的时间短,可扩大性好

其实今朝阿里分布式事务处理筹划--GTS(Gloabel Trasaction Service)正在公测中,概略可以参考这篇公众号文章:GTS来了!阿里微办事架构下的分布式事务处理筹划

参考材料


695856371Web网页设计师②群 | 爱好本站的同伙可以收藏本站,或许参加我们大年夜家一路来交换技巧!

5条评论

Loading...


自定义皮肤 主体内容背景
翻开付出宝扫码付款购买视频教程
碰到成绩接洽客服QQ:419400980
注册梁钟霖小我博客