1 Seata架构
Seata目前支持四种分布式方案,其整体架构有很多相似之处,这里从整体上介绍方案,具体每种方案见相关博客。
1.1 整体架构
注:此图来自seata官网
- TC (Transaction Coordinator) 事务协调者:维护全局和分支事务的状态,驱动全局事务提交或回滚。
- TM (Transaction Manager)事务管理器:定义全局事务的范围:开始全局事务、提交或回滚全局事务。
- RM (Resource Manager)
资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
接下来看看AT、TCC、XA、Saga的的区别。
1.2 Seata-AT
注:此图来自seata官网。
Seata-AT模式
1.3 Seata-TCC
注:此图来自seata官网。
Seata-TCC模式
1.4 Seata-Saga
1.5 Seata-XA
注:此图来自seata官网。
Seata-XA模式
2 源码简介
seata-server的源码见seata;如果要研究源码,可从以下几个类入手:
2.1 全局事务开启入口
- GlobalTransactionalInterceptor:全局事务拦截器,TM中全局事务由此类开启,并由此类通知TC进行Global Commit/Rollback。主要参考以下方法:
- public Object invoke(final MethodInvocation methodInvocation) throws Throwable;
负责分布式事务的开启、提交、回滚。
- public Object invoke(final MethodInvocation methodInvocation) throws Throwable;
- StateMachineInstance:saga分布式事务状态机实例,用于saga分布式事务的管理。
2.2 RM请求受理入口
- AbstractRMHandler:RM接受TC请求的主要入口。
- public BranchCommitResponse handle(BranchCommitRequest request) ;
处理分支提交请求。 - public BranchRollbackResponse handle(BranchRollbackRequest request) ;
处理分支回滚请求。
- public BranchCommitResponse handle(BranchCommitRequest request) ;
2.3 TC请求受理入口
- AbstractTCInboundHandler:TC处理TM、RM请求的主要入口。
- public GlobalBeginResponse handle(GlobalBeginRequest request, final RpcContext rpcContext) ;
受理TM的begin请求。 - public GlobalCommitResponse handle(GlobalCommitRequest request, final RpcContext rpcContext) ;
受理TM的全局事务提交请求。 - public GlobalRollbackResponse handle(GlobalRollbackRequest request, final RpcContext rpcContext) ;
受理TM的全局事务回滚请求 - public BranchRegisterResponse handle(BranchRegisterRequest request, final RpcContext rpcContext) ;
受理RM的注册分支事务的请求 - public BranchReportResponse handle(BranchReportRequest request, final RpcContext rpcContext);
Saga事务模式下,state通过此方法向TC报告分支事务信息。 - public GlobalReportResponse handle(GlobalReportRequest request, final RpcContext rpcContext)
Saga事务模式下,state通过此方法向TC报告全局事务信息。
- public GlobalBeginResponse handle(GlobalBeginRequest request, final RpcContext rpcContext) ;
2.4 补偿
在DefaultCoordinator中有几个定时任务,用于失败重试或补偿,确保以上流程出异常或者系统被强行关机以后,依然能保证全局事务的准确性。
- retryRollbacking:回滚失败后,尝试重新Global Rollback。
- retryCommitting:提交失败后,尝试重新Global Commit。
- asyncCommitting:和retryCommitting类似,不过针对异步的Global Commit。
- timeoutCheck:检查全局事务是否超时。
- undoLogDelete:异步删除undo log。
3 参考文档
分布式事务 Seata 及其三种模式详解 | Meetup#3 回顾