当前位置: 首页 > 科技观察

SpringCloudAlibaba分布式事务解决框架Seata概念介绍

时间:2023-03-12 05:39:07 科技观察

Seata中文参考文档:http://seata.io/zh-cn/docs/overview/what-is-seata.html介绍分布式解决方案的相关概念,本文将为大家带来由SpringCloudAlibaba开源的分布式解决方案框架Seata。本文介绍了Seata组件的相关概念。如果想使用Seata解决分布式事务问题请看下一篇文章。一、什么是微服务架构《微服务架构是一种架构模式,提倡将单个应用程序划分为一组小的服务,服务之间相互协调配合,为用户提供最终价值。每个服务运行在其上独立的进程,服务之间使用轻量级的通信机制(通常是基于HTTP的RestfulAPI)进行通信。每个服务都围绕特定的业务构建,可以独立部署到生产环境、类生产环境等。此外,还有一个尽量避免统一集中的服务管理机制,针对具体的服务,根据业务上下文选择合适的语言和工具来构建。2.分布式事务生成1.单体架构一个用户的完整下单进程,在一个单体应用程序中,只需要在一个项目中,在一个数据库中,通过调用订单接口,下单时调用扣除库存方法和扣除方法减去账户余额完成下单。2、分布式架构的单体应用拆分成微服务应用,将原来的三个模块拆分成三个独立的应用,各自使用不同的数据源,需要调用三个服务来完成业务运行。这时候各个服务内部的数据一致性由本地事务来保证,但是全局的数据一致性问题无法保证,分布式事务就这样产生了。三、Seata的4种事务模式1、什么是SeataSeata是一个开源的分布式事务解决方案,致力于提供高性能易用的分布式事务服务。Seata将为用户提供AT、TCC、SAGA和XA交易模式。默认使用AT模式为用户打造一站式分布式解决方案。2、AT模式的前提是基于支持本地ACID事务的关系型数据库。Java应用程序,通过JDBC访问数据库。整体机制通过2PC两阶段提交协议演进:第一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。阶段2:异步提交。如果成功,相应的回滚日志记录将被批量删除。如果失败,将通过回滚日志进行反向补偿。写隔离1)、第一阶段提交本地事务前,需要保证先获取到全局锁。2)如果获取不到全局锁,则无法提交本地事务;如果拿到了全局锁,就可以提交本地事务,插入undo_log记录。3)获取全局锁的尝试被限制在一定范围内,超过范围则放弃,根据undo_log记录回滚本地事务,释放本地锁。读隔离1)、基于ReadCommitted(已提交读)或以上的数据库本地事务隔离级别,Seata(AT模式)默认的全局隔离级别是未提交读(ReadUncommitted)。理解:在全局事务提交前,本地事务会先提交。此时查询数据对于本地库是ReadCommitted,对于全局事务是ReadUncommitted。2)如果需要globalread-committed,目前的Seata方法是通过SELECTFORUPDATE语句的代理。3、TCC模式TCC不依赖RM对分布式事务的支持,而是通过分解业务逻辑来实现分布式事务。1)前期运营Try:完成所有业务检查,储备必要的业务资源。2)确认操作Confirm:真正执行的业务逻辑不做任何业务检查,只使用Try阶段预留的业务资源。所以只要Try操作成功,Confirm就一定成功。另外,Confirm操作需要幂等,保证一个分布式事务只能成功一次。3)Cancel操作Cancel:释放Try阶段预留的业务资源。同样,取消操作也需要满足幂等性。所谓TCC模式,是指支持将自定义分支事务纳入全局事务管理。4.SAGA模式概述Seata提供的长事务解决方案。在Saga模式下,业务流程中的每个参与者都提交一个本地事务。当参与者失败时,先前成功的参与者将得到补偿。第一阶段转发服务和第二阶段补偿服务都是由业务开发来实现的。适用场景:业务流程长,业务流程参与方多,包括其他公司或遗留系统服务,无法提供TCC模型所需的三大接口优势:单阶段本地事务提交、无锁、高-性能事件驱动架构,参与者可以异步执行,高吞吐量补偿服务容易实现缺点:不能保证隔离基于状态机引擎的Saga实现。目前SEATA提供的Saga模式是基于状态机引擎实现的。其机制是:通过状态图定义服务调用的过程,生成json状态语言定义文件。状态图中的节点可以是服务调用,节点可以配置其补偿节点。状态图json由状态机引擎驱动执行。当异常发生时,状态引擎反向执行成功节点对应的补偿节点,回滚交易。异常发生时是否进行补偿也可以由用户自行决定。可实现服务编排需求,支持单选、并发、分流程、参数转换、参数映射、服务执行状态判断、异常捕获等功能。示例状态图:5.XA模式先决条件支持XA事务的数据库。Java应用程序,通过JDBC访问数据库。整体机制在Seata定义的分布式事务框架内,利用事务资源(数据库、消息服务等)支持XA协议,利用XA协议的机制管理分支事务的事务模式。执行阶段:回滚:业务SQL操作在XA分支进行,资源对XA协议的支持保证回滚持久化:XA分支完成后,执行XA准备。同样,资源对XA协议的支持,保证持久化(即任何意外都不会造成无法回滚的情况)完成阶段:分支提交:执行XA分支的提交分支回滚:执行XA分支的回滚XA分支关于XA模式的介绍,这里简单提一下更详细的资料可以参考:http://seata.io/zh-cn/docs/dev/mode/xa-mode.html4.Seata模型介绍Seata的整个流程模型如下图所示:主要有三个两个角色:TM:事务管理器,用来告诉TC全局事务的开始、提交、回滚。TC:事务协调器,即seata-server,维护全局事务和分支事务的状态,通知各个RM提交或回滚。RM:资源管理器,每个RM都会在TC中注册为一个分支事务,负责分支事务的注册、提交和回滚。术语介绍:XID——TransactionID,一个分布式事务的唯一标识。TC——事务协调器,维护全局事务和分支事务的状态,驱动全局事务的提交或回滚。TM-TransactionManager,定义了一个全局事务的范围:启动一个全局事务,提交或回滚一个全局事务。RM-资源管理器,管理分支事务的资源,与TC对话以注册分支事务并报告分支事务的状态,并驱动分支事务提交或回滚。一个典型的分布式事务处理过程包括以下步骤:TM请求TC开启全局事务,TC返回全局事务的XID给TM,即XID;XID在微服务调用链接的上下文中传播;RM在TCTransactions注册branch,包含在全局交易对应的XID的管辖范围内;TM根据XID向TC发送commit或rollback请求;TC根据XID进行RM提交或回滚。分布式事务框架Seata,原名Fescar,后与AntTCC方案集成后更名为Seata。截至2020年11月3日,Seata已更新至v1.4.0版本。虽然在之前的版本发布中,存在一些潜在的问题,但是开源团队很快修复了问题,发布新版本的速度也很快,所以目前还是比较稳定的。同时,与其他分布式事务框架相比,Seata架构有几个亮点:应用层实现了基于SQL解析的自动补偿,从而最大限度地减少业务入侵;分布式事务中的TC(transactioncoordinator)是独立的Deployment,负责事务的注册和回滚;写隔离和读隔离是通过全局锁实现的。6.参考文档Seata中文官方文档:http://seata.io/zh-cn/docs/overview/what-is-seata.htmlSeata-Server下载地址:https://github.com/seata/seata/releases分布式事务Demo:https://github.com/seata/seata-samplesSeata源码地址:https://github.com/seata/seataSeata中文参考文档:http://seata.io/zh-cn/docs/概述/what-is-seata.html