欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring Cloud Alibaba入门实践(三十七)-分布式事务组件Seata

程序员文章站 2022-03-21 15:56:13
之前如果在单体项目中,想要保证数据的一致性,就需要使用到事务。事务是什么?事务指的就是一个操作单元,在这个操作单元中的所有操作最终要保持一致的行为,要么所有操作都成功,要么所有的操作都被撤销。单机情况或者单服务的情况下,只要是一个服务能提供所有功能,哪怕是这个服务是多实例的,也可以使用本地事务来保证数据的一致性。但是微服务架构下,是由多个微服务协同合作,作为一个整体对外提供服务,虽然在用户看来,好像还是一个系统,没什么变化,但是对于开发者来说,引入了微服务架构,系统的复杂性也大大增加了,需要考虑的更全...

之前如果在单体项目中,想要保证数据的一致性,就需要使用到事务。

事务是什么?

事务指的就是一个操作单元,在这个操作单元中的所有操作最终要保持一致的行为,要么所有操作都成功,要么所有的操作都被撤销。

单机情况或者单服务的情况下,只要是一个服务能提供所有功能,哪怕是这个服务是多实例的,也可以使用本地事务来保证数据的一致性。但是微服务架构下,是由多个微服务协同合作,作为一个整体对外提供服务,虽然在用户看来,好像还是一个系统,没什么变化,但是对于开发者来说,引入了微服务架构,系统的复杂性也大大增加了,需要考虑的更全面,比如此时如果要保证数据的一致性,还是使用本地事务么?我们可以简单把本地事务理解为是数据库提供的事务机制,那么微服务架构下,每个微服务都有自己的数据库,本地事务自然就不适用了,这就引出了分布式下的事务问题。

分布式事务是什么?

由于事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上,一次业务操作可能要经过不同的服务器,不同的数据库,因此引发了分布式事务的问题,所以分布式事务本质上要解决的就是保证不同数据库的数据一致性。

那么分布式事务有哪些解决方案?

方案的话,可提供选择的也很多,比如基于X/A协议的两阶段提交和三阶段提交,基于消息中间件的可靠消息服务和最大努力通知,以及TCC事务方案等,而Spring Cloud Alibaba也提供了用来解决分布式事务的组件Seata

Seata是什么?

2019 年1月,阿里巴巴中间件团队发起了开源项目Fescar(Fast & EaSy Commit And Rollback),其愿景是让分布式事务的使用像本地事务的使用一样,简单和高效,并逐步解决开发者们遇到的分布式事务方面的所有难题。后来更名为Seata,意为:Simple Extensible Autonomous Transaction Architecture,是一套分布式事务解决方案。

Seata的设计目标是对业务无侵入,因此从业务无侵入的2PC方案着手,在传统2PC的基础上演进。 它把一个分布式事务理解成一个包含了若干分支事务的全局事务。全局事务的职责是协调其下管辖的分支事务达成一致,要么一起成功提交,要么一起失败回滚。而通常分支事务本身就是一个关系数据库的本地事务。

Seata主要由三个重要组件组成:

TC:Transaction Coordinator 事务协调器,管理全局的分支事务的状态,用于全局性事务的提交和回滚。

TM:Transaction Manager 事务管理器,用于开启、提交或者回滚全局事务。

RM:Resource Manager 资源管理器,用于分支事务上的资源管理,向TC注册分支事务,上报分支事务的状态,接受TC的命令来提交或者回滚分支事务。

下面简单的了解一下Seata的执行流程:

假设服务A需要远程调用服务B。

  • 首先服务A作为整条业务链的发起者,A服务的TM会先向TC申请开启一个全局事务,TC就会创建一个全局事务并返回一个唯一XID作为标识。
  • 申请好全局事务后,这时候服务A就要执行自己的本地事务了,此时服务A的RM会向TC注册分支事务,并将其纳入XID对应全局事务的管辖(这就能够理解为什么一个全局事务下会有多个分支事务了,因为每个服务的RM都会向TC注册分支事务)。
  • 服务A注册好分支事务后,就会执行自己的本地事务,操作数据库。
  • 服务A的本地事务执行成功后,就会远程调用服务B,然后之前申请的全局事务标识XID会在该条调用链上传播。
  • 服务A就要执行自己的本地事务了,此时服务B的RM也会向TC注册分支事务,并将其纳入XID对应全局事务的管辖(这就能够理解为什么一个全局事务下会有多个分支事务了,因为每个服务的RM都会向TC注册分支事务)。
  • 服务B注册好分支事务后,就会执行自己的本地事务,操作数据库。
  • 此时整个服务调用链已经处理完毕了,这整个服务调用链都有全局事务标识XID贯穿其中,所以TM可以根据有无异常向TC发起全局事务的提交或者回滚。
  • 由于TC里注册了服务调用链上的所有分支事务,所以TC可以协调其管辖之下的所有分支事务, 决定是提交还是回滚。

Seata实现2PC与传统2PC的差别:

  1. 架构层次方面,传统2PC方案的RM实际上是在数据库层,RM本质上就是数据库自身,通过XA协议实现,而Seata的RM是以jar包的形式作为中间件层部署在应用程序这一侧的。
  2. 两阶段提交方面,传统2PC无论第二阶段的决议是commit还是rollback,事务性资源的锁都要保持到Phase2(阶段二)完成才释放。而Seata的做法是在Phase1(阶段一)就将本地事务提交,这样就可以省去Phase2(阶段二)持锁的时间,整体提高效率。

本文地址:https://blog.csdn.net/weixin_38106322/article/details/109616230