Seata是一个开源的分布式事务解决方案,旨在为微服务架构提供高效且可靠的分布式事务服务。Seata通过确保分布式事务的一致性,帮助开发者解决在微服务架构下的跨服务数据一致性问题。
Seata的3个核心组件
1.TC(Transaction Coordinator):
事务协调器,维护全局和分支事务的状态,协调全局事务提交或回滚 ,直接调度事务参与者RM。负责将RM的反馈结果响应给TM,并听从TM的最终决议,将具体决议(提交或回滚)发送给RM执行。相当于中间人,主要负责维护全局事务和分支事务的状态。
2. TM(Transaction Manager):
事务管理器,定义全局事务的范围、开始全局事务、提交或回滚全局事务。 它是事务的发起者(具体的微服务)。根据RM第一阶段的执行结果,进行决议。并将决议反馈给TC。
3. RM(Resource Manager):
资源管理器,管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。 其实就是事务的参与者。获取TC的执行命令具去执行分支事务的第一阶段以及第二阶段,并将执行结果反馈给TC。
三个组件相互协作,期中TC以Seata服务器(Server)形式独立部署(Seata Server的安装运行后续介绍),TM和RM则是以 Seata Client 的形式集成在微服务中运行。
Seata的4种事务模式
1. **AT 模式(Automatic Transaction Mode)**
- **主要原理**:基于二阶段提交协议(2PC)的变种,通过记录数据的全局锁、前镜像和后镜像来实现分布式事务。第一阶段是本地事务的执行和准备提交,记录数据快照;第二阶段是根据一阶段的结果来决定是提交还是回滚。AT模式避免了全局锁和阻塞的问题,从而提高了系统的并发性能。在AT模式中,参与者的本地事务执行成功后即可提交,而不需要等待其他参与者的状态。AT模式需要配合数据库的undo_log数据表一起实现。
- **适用场景**:适用于对数据一致性要求较高,且业务操作可以容忍一定延迟的场景。
- **主要区别**:实现复杂度相对较低,性能优于XA模式,主要用于替代XA模式的场景。
- **代码实现**:
添加配置seata:data-source-proxy-mode: AT
在需要分布式事务的业务代码上添加注解@GlobalTransactional
2. **TCC 模式(Try-Confirm-Cancel)**
- **主要原理**:基于补偿事务的思想,分为三个操作阶段:尝试(Try)、确认(Confirm)、取消(Cancel)。每个业务操作都需要实现这三个操作,以确保分布式事务的最终一致性。
- **适用场景**:适用于业务逻辑较为复杂,要求较高的业务处理流程。需要开发者针对每个业务操作,明确实现Try、Confirm和Cancel三个方法;还需要需要考虑Confirm和Cancel的失败情况下做好幂等处理。
- **主要区别**:相较于AT模式,TCC模式对业务侵入性更高,需要开发者明确定义补偿逻辑,但它提供了更高的灵活性和性能。
3. **Saga 模式**
- **主要原理**:通过长事务来维护各个微服务之间的数据一致性。Saga 分为多个子事务,每个子事务执行完成后都会发布事件,触发下一个子事务,如果某个子事务失败,则执行补偿操作以回滚之前的操作。 Saga模式的执行过程如下:
执行正向操作:按照事务的逻辑顺序,依次执行正向操作。每个正向操作都会记录事务的执行状态。
如果所有的正向操作都成功执行,则事务提交完成。
如果某个正向操作失败,将会触发相应的补偿操作。补偿操作会撤销或修复正向操作的影响。
执行补偿操作:按照逆序依次执行已经触发的补偿操作。补偿操作应该具备幂等性,以便可以多次执行而不会造成副作用。
如果所有的补偿操作都成功执行,则事务回滚完成。
如果补偿操作也失败,需要人工介入或其他手段来解决事务的一致性问题。
- **适用场景**:适用于长事务场景,特别是那些无法使用TCC或AT模式的场景。
- **主要区别**:Saga模式通过定义一系列的本地事务和补偿操作来保证整体事务的一致性,适合于长事务处理。与TCC相比,Saga模式可能会有更长的事务持续时间,但对业务的侵入性较小。
4. **XA 模式**
- **主要原理**:基于XA接口的分布式事务实现,遵循两阶段提交协议。XA模式通过资源管理器(RM)、事务管理器(TM)和应用程序(AP)三者的协作,完成分布式事务的管理。从编程模型上,XA 模式与 AT 模式保持完全一致。只需要修改数据源代理,即可实现 XA 模式与 AT 模式之间的切换。
- **适用场景**:适用于需要严格遵守ACID原则的分布式事务管理场景。
- **主要区别**:XA是一种较为传统的解决方案,支持严格的ACID事务,但性能较低,资源消耗较大。
- **代码实现**:
添加配置seata:data-source-proxy-mode: XA
在需要分布式事务的业务代码上添加注解@GlobalTransactional
福利来了,京东618无门槛红包,速抢,亲测可用!!!