近两年微服务变得越来越火热,各种框架与组件的出现,更是为微服务的开发提供了便利。7gK数据军团

  我们都知道,每个微服务都是一个对应的小服务,多个服务之间可以方便的进行功能的组合,来形成功能更强大的服务。服务间数据与部署都是独立的,这样故障也可以做到相互隔离。但是这也带来了分布式应用都会面对的问题:7gK数据军团

  如何保证多个服务间的事务?怎样才能使操作的原子性、一致性等得到保证?7gK数据军团

  对于传统的应用开发与部署,可以通过数据的事务来保证所谓的ACID,而微服务的场景下,数据库就力不从心了。7gK数据军团

  这个时候,2PC、3PC轮番登场,来解决这类的问题。但有些场景下,我们根据自己的真实需要,并不需要纯的2PC,比如你只关心数据的原子性与最终一致性,那2PC阶段的阻塞是你不能忍受的,那就有聪明的人想到了一种新的办法。就是我们今天要说的柔性事务TCC。7gK数据军团

  什么是柔性事务TCC?7gK数据军团

  我们今天说的柔性事务,「柔」主要是相对于「传统」ACID的刚而言,柔性事务只需要遵循BASE原则。而TCC是柔性事务的一种实现。TCC是三个首字母,Try-Confirm-Cancel,具体描述是将整个操作分为上面这三步。两个微服务间同时进行Try,在Try的阶段会进行数据的校验,检查,资源的预创建,如果都成功就会分别进行Confirm,如果两者都成功则整个TCC事务完成。如果Confirm时有一个服务有问题,则会转向Cancel,相当于进行Confirm的逆向操作。7gK数据军团

  tcc分布式事务原理(tcc分布式事务)7gK数据军团

  整个柔性事务有多种实现的思想,例如:7gK数据军团

  tcc分布式事务原理(tcc分布式事务)7gK数据军团

  具体使用7gK数据军团

  之前的项目开发中,我们也有类似的场景需要保证两个微服务间的一致性,根据具体的场景需要,用到了TCC事务。当时是通过部门的一个基础组件,是通过异步补偿的形式来保证。7gK数据军团

  目前也有一些开源的TCC实现,可以直接在GitHub上获取到,例如下面这个7gK数据军团

  https://github.com/changmingxie/tcc-transaction7gK数据军团

  基本实现原理7gK数据军团

  这些TCC的框架,基本都是通过「注解」的形式,在注解中声明Confirm方法与Cancel方法,再通过AOP对带点该注解的方法统一进行拦截,之后根据结果分别再执行 Confirm 或者 Cancel。7gK数据军团

  代码类似这个样子:7gK数据军团

  @Compensable(confirmMethod=“confirmRecord”, cancelMethod=“cancelRecord”, transactionContextEditor=MethodTransactionContextEditor.class)7gK数据军团

  public String record(TransactionContext transactionContext, CapitalTradeOrderDto tradeOrderDto) {7gK数据军团

  confirm方法7gK数据军团

  public void confirmRecord(TransactionContext transactionContext, CapitalTradeOrderDto tradeOrderDto) {7gK数据军团

  cancel方法:7gK数据军团

  public void cancelRecord(TransactionContext transactionContext, RedPacketTradeOrderDto tradeOrderDto) {7gK数据军团

  基于类似的框架,可以比较方便的满足我们的业务使用场景。欢迎留言补充你在分布式的场景中是通过什么方式来保证一致性的。7gK数据军团

  tcc分布式事务原理(tcc分布式事务)7gK数据军团

  补充说明:7gK数据军团

  文中图片来源于「支付宝架构与技术」文档,感兴趣的朋友可以自行搜索获取该文件。7gK数据军团

版权声明:本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。