Seata是什么及其实现原理
Seata是一个由阿里开源的分布式事务处理框架,前身为Fescar,经过品牌升级后更名为Seata。它专注于为分布式系统提供高效、简洁的分布式事务解决方案,使业务开发者能够专注于核心业务开发,而无需过多关注分布式事务的复杂性。
一、分布式事务背景
随着业务的发展,单体系统逐渐无法满足业务需求,分布式架构逐渐成为大型互联网平台的首选。然而,分布式架构带来了新的问题,即本地事务方案已经无法满足分布式环境下的事务需求。因此,分布式事务相关规范和框架应运而生,Seata就是其中之一。
二、分布式事务相关概念
- 事务:一个程序执行单元,是用户定义的一组操作序列,需要满足ACID(原子性、一致性、隔离性、持久性)属性。
- 本地事务:事务由本地资源管理器(如DBMS)管理。
- 分布式事务:事务的操作位于不同的节点上,需要协调多个节点的资源管理器来完成。
- 分支事务:在分布式事务中,由资源管理器管理的本地事务。
- 全局事务:一次性操作多个资源管理器完成的事务,由一组分支事务组成。
三、分布式事务实现规范
对于分布式事务,目前主要有两种思路:XA协议的强一致规范以及柔性事务的最终一致性规范。
- XA协议:基于二阶段提交协议设计的接口标准,实现了XA规范的资源管理器可以参与XA全局事务。应用承担事务管理器(TM)工作,数据库承担资源管理器(RM)工作,TM生成全局事务ID,控制RM的提交和回滚。
- 柔性事务的最终一致性:主要有TCC、MQ事务消息、本地消息表等实现方式。这些方式通过不同的机制来保证分布式事务的最终一致性。
四、Seata架构
Seata有三个核心组件:
- Transaction Coordinator(TC,事务协调器):维护全局事务和分支事务的状态,驱动全局事务提交或回滚。
- Transaction Manager(TM,事务管理器):定义全局事务的范围,开始事务、提交事务、回滚事务。
- Resource Manager(RM,资源管理器):管理分支事务上的资源,向TC注册分支事务,汇报分支事务状态,驱动分支事务的提交或回滚。
Seata支持四种工作模式:
- AT(Auto Transaction)模式:Seata默认的工作模式,需要基于支持本地ACID事务的关系型数据库,通过JDBC访问数据库。AT模式通过一阶段业务数据和回滚日志记录在同一个本地事务中提交,二阶段提交异步化,回滚通过一阶段的回滚日志进行反向补偿。
- TCC模式:分为prepare/commit/cancel三个阶段,需要手动编码回滚逻辑,业务侵入性较大。
- Saga模式:长事务解决方案,将长事务分解成一系列子事务,每个子事务都有对应的补偿动作。Saga模式一阶段提交本地事务,无锁,高性能,但不保证隔离性。
- XA模式:基于二阶段提交设计的接口标准,需要分支数据库支持XA事务。XA模式继承了XA协议的优势,事务具有强一致性,但并发度低。
五、AT模式核心实现
AT模式是Seata默认且最常用的模式,其核心实现包括以下几个部分:
- 事务协调器的启动:TC以独立的服务启动,作为Server,维护全局事务和分支事务的状态。
- 事务管理器的启动:TM集成在应用中启动,负责定义全局事务的范围。
- 资源管理器的启动:RM集成在应用中启动,负责管理分支事务上的资源。RM通过配置DataSourceProxy实现对数据源访问的代理,包括SQL解析、生成undo-log、业务SQL和undo-log一并本地提交等操作。
全局事务的工作流程以一个简单的购买服务和库存管理服务为例:
- 购买服务通过GlobalTransactional注解发起全局事务,调用库存服务的deduct方法。
- 在一阶段,业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
- 在二阶段,根据全局事务的结果决定是提交还是回滚分支事务。如果全局事务提交,则异步完成分支事务的提交;如果全局事务回滚,则通过一阶段的回滚日志进行反向补偿。
六、写隔离和读隔离实现
- 写隔离:全局事务未提交时,通过全局锁来避免其他事务修改已锁定的资源。
- 读隔离:在数据库本地隔离级别为读已提交或以上的基础上,Seata提供了读未提交和读已提交两种选项。读未提交允许在全局事务提交前读取分支事务已提交的数据;读已提交则需要在select语句上加for update来实现。
七、总结
Seata是Java领域很强大的分布式事务框架,它支持多种模式,其中AT模式对业务零入侵实现分布式事务,对开发者更加友好。Seata通过事务协调器、事务管理器和资源管理器三个核心组件的协作,以及四种工作模式的支持,为分布式系统提供了高效、简洁的分布式事务解决方案。同时,Seata还提供了写隔离和读隔离的实现机制,保证了分布式事务的一致性和隔离性。