什么是 TCC分布式事务?
近两年微服务变得越来越火热,各种框架与组件的出现,更是为微服务的开发提供了便利。
我们都知道,每个微服务都是一个对应的小服务,多个服务之间可以方便的进行功能的组合,来形成功能更强大的服务。服务间数据与部署都是独立的,这样故障也可以做到相互隔离。但是这也带来了分布式应用都会面对的问题:
如何保证多个服务间的事务?怎样才能使操作的原子性、一致性等得到保证?
对于传统的应用开发与部署,可以通过数据的事务来保证所谓的ACID,而微服务的场景下,数据库就力不从心了。
这个时候,2PC、3PC轮番登场,来解决这类的问题。但有些场景下,我们根据自己的真实需要,并不需要纯的2PC,比如你只关心数据的原子性与最终一致性,那2PC阶段的阻塞是你不能忍受的,那就有聪明的人想到了一种新的办法。就是我们今天要说的柔性事务TCC。
什么是柔性事务TCC?
我们今天说的柔性事务,「柔」主要是相对于「传统」ACID的刚而言,柔性事务只需要遵循BASE原则。而TCC是柔性事务的一种实现。TCC是三个首字母,Try-Confirm-Cancel,具体描述是将整个操作分为上面这三步。两个微服务间同时进行Try,在Try的阶段会进行数据的校验,检查,资源的预创建,如果都成功就会分别进行Confirm,如果两者都成功则整个TCC事务完成。如果Confirm时有一个服务有问题,则会转向Cancel,相当于进行Confirm的逆向操作。
整个柔性事务有多种实现的思想,例如:
具体使用
之前的项目开发中,我们也有类似的场景需要保证两个微服务间的一致性,根据具体的场景需要,用到了TCC事务。当时是通过部门的一个基础组件,是通过异步补偿的形式来保证。
目前也有一些开源的TCC实现,可以直接在GitHub上获取到,例如下面这个https://github.com/changmingxie/tcc-transaction
基本实现原理
这些TCC的框架,基本都是通过「注解」的形式,在注解中声明Confirm方法
与Cancel方法
,再通过AOP对带点该注解的方法统一进行拦截,之后根据结果分别再执行 Confirm 或者 Cancel。
代码类似这个样子:
@Compensable(confirmMethod = "confirmRecord", cancelMethod = "cancelRecord", transactionContextEditor = MethodTransactionContextEditor.class)
public String record(TransactionContext transactionContext, CapitalTradeOrderDto tradeOrderDto) {
confirm方法
public void confirmRecord(TransactionContext transactionContext, CapitalTradeOrderDto tradeOrderDto) {
cancel方法:
public void cancelRecord(TransactionContext transactionContext, RedPacketTradeOrderDto tradeOrderDto) {
基于类似的框架,可以比较方便的满足我们的业务使用场景。欢迎留言补充你在分布式的场景中是通过什么方式来保证一致性的。
补充说明:
文中图片来源于「支付宝架构与技术」文档,感兴趣的朋友可以自行搜索获取该文件。
原文发布时间为:2018-09-7
本文作者:xxx
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
程序人生,五年后同学再聚首!看看他们的职业生涯
白天搬砖,晚上砌梦想,每个人都有自己的故事,程序员更是有许多事故,作者来分享下程序员的故事。 工作五年是一个分水岭,大部分程序员都已经从初级工程师成长成为中高级工程师,薪水也有较大幅度的增长。一个学校毕业的人也有不同的发展轨道,我们来谈谈我的大学同学毕业五年后相聚的现状。 周星: 专注在一家公司走技术管理线路,专注于业务撕逼,月薪大约2万。在大学身为班长的周星有较好的领导能力,愿意主动承担程序员不愿意去做的沟通联系工作。他逐渐往技术管理方向发展,互联网人才流动性大,在公司的第三年任命为了部门经理。我问他往后是否有跳槽的打算,他摇头道,他目前工资还可以,虽然比不上走技术方向的同学,可公司认可他的忠诚和管理能力,他的下一个目标是公司的高级经理。 郭翔: 一开始和大家都差不多,他找的工作也差不多,一年后听说他离职跟着学长去创业了,在聚会时已经是公司的技术总监。原来当时他搞互联网金融,当年风口一到,作为初创成员之一的他乘着东风升至技术总监,年薪百万。现在公司规模日渐扩大,有几个同学已经投奔他靡下。 黄帆: 黄帆先在一家二线互联网公司,月薪6K左右,第二年跳槽,月薪至10k,第三年...
- 下一篇
Java 程序员必会的技术
每一位程序员都有一个英雄梦,幻想着有朝一日能够 拳打国内BAT,脚踢硅谷FLG。至少至少,也要成为后厂村一霸。 对于后端程序员来说,有一项至关重要的技术可以帮助我们早日实现梦想。这项技术不是满天乱飞的架构设计,也不是高深莫测的算法题目,而是工作中实打实的核心技术框架:Spring Boot。 最优技术,没有之一! Spring Boot 诞生时,正处于微服务概念在慢慢酝酿中,Spring Boot 的研发融合了微服务架构的理念,实现了在 Java 领域内微服务架构落地的技术支撑。Spring Boot 在开发、测试、部署、运维等方面都做了大量的优化,使用 Spring Boot 开发项目,可以快速响应需求、独立完成开发部署上线。 Spring Boot 的一系列特性有助于实现微服务架构的落地,从目前众多的技术栈对比来看它是 Java 领域微服务架构最优落地技术,没有之一。 牛逼在何处? 曾子曰:Spring 是 Java 的三大框架之一,几乎所有 Java 企业应用需要用到的基础组件都可以在 Spring 框架中找到。 但在一个新应用中将所有需要的 Spring 组件整合并配置好并不容...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS关闭SELinux安全模块