在上一篇文章中,我们介绍了分布式事务的概念和一些解决方案。fenSeata是一个开源的分布式事务解决方案,致力于提供高性能易用的分布式事务服务。Seata将为用户提供AT、TCC、SAGA和XA交易模式,为用户打造一站式的分布式解决方案。Seata简介本文以一个用户下单购买商品的系统为例,介绍开源框架Seata的原理和使用。下单时系统涉及三部分服务:仓储服务:扣减指定商品的入库数量;订单服务:根据采购需求创建订单;账户服务:从用户账户中扣除余额;分布式事务的主要作用是在微服务的情况下保证用户下单过程中数据的一致性。这里的一致性可以这样理解:不会出现用户余额扣款成功,而入库和订单相关操作失败,三者要么同时成功,要么同时失败的场景。单机交易场景如果用户下单购买商品涉及的服务都在一个传统的单机服务中,这三部分服务可以共享同一个数据库实例。在这种情况下,我们可以通过本地交易的一致性来保证仓库/订单/账户之间数据的一致性。如上图所示,在单机服务中,三部分共享同一个数据库实例,所以我们只需要本地事务来解决数据一致性问题。以Spring框架为例,我们只需要在方法上加上@Transaction注解即可。可以实现整个购买流程的数据一致性:@Transactionpublicvoidpurchase(){doStoreBusiness();doOrderBusiness();doAccountBusiness();}分布式事务场景在微服务框架中,存储/订单/账户服务部署在不同的服务器上,使用不同的数据库实例,与单机模式完全不同。单机模式下的事务通常要求事务中涉及的数据源相同,并且事务中涉及的数据库操作在同一个数据库链接中,这显然不满足分布式情况下的条件。那么如何保证分布式场景下的数据一致性呢?这就是Seata需要解决的问题。Seata解决方案Seata是一个用于解决分布式事务的开源框架。它内部对分布式事务的定义是这样的:分布式事务是由多个分支事务组成的全局事务,其中每个分支事务是一个局部事务形式。Seata框架由三部分组成:事务协调器(TransactionCoordinator,TC):维护全局事务和分支事务的状态,进行全局事务提交或全局事务回滚;事务管理器(TransactionManager,TM):定义全局事务,开启全局事务,提交全局事务或回滚全局事务;资源管理器(ResourceManager,RM):管理分支事务中的资源,向事务管理器注册分支事务并上报分支事务状态,负责分支事务的提交或回滚;典型的seata分布式事务流程如下:TM向TC发送请求开启全局事务,TC生成全局事务的唯一标识XID。设这里的全局事务为T1;在全局事务T1的各个进程中,都会使用XID作为事务标识在微服务之间流转;RM向TC注册本地事务,注册的本地事务将作为全局事务T1的分支事务;TM可以请求TC控制全局事务T1的提交或者全局事务T1的回滚;TC可以请求全局事务T1下的所有分支事务提交或回滚;SeataHistoryAlibaba:TXC:淘宝交易系统分布式事务框架,阿里巴巴中间件团队于2014年启动该项目,解决应用架构从单体服务向微服务过渡带来的分布式事务问题;GTS:全球交易服务。TXC是阿里云的中间件产品,2016年发布新名称GTS;Fescar:Fescar是一个基于TXC/GTS的开源项目,于2019年上线,用于开源项目社区的发展;蚂蚁金服:XTS:扩展交易服务。蚂蚁金服的中间件团队从2007年开始研发分布式交易中间件,该中间件在蚂蚁金服得到广泛应用,解决了跨数据库、跨服务的数据一致性问题。DTX:分布式事务扩展。2013年开始,XTS以DTX的名义在蚂蚁金服云上发布;Seata社区:Seata:简单且可扩展的分布式事务解决方案,蚂蚁金服更名为FedscarSeata并开源,使其成为一个中立的、开放的分布式事务社区。SeataMaven依赖
