所有文章
https://www.cnblogs.com/lay2017/p/12485081.html
正文
由seata-server的main方法我们可以知道,netty的RPC机制负责了网络部分的职责。而DefaultCoordinator负责了分布式事务协调者的主体功能。
本文将预先看看DefaultCoordinator的整体结构
UML类图
必不可少的,首先看看DefaultCoordinator的类图结构
DefaultCoordinator主要实现了三个接口
1)TCInboundHandler,作为事务协调者处理器
2) ResourceManagerInbound,作为Server端的资源管理器
3)TransactionMessageHandler,作为事务的消息处理器
TransactionMessageHandler无非就是经过RPC调用的请求消息比如全局事务begin、commit、rollback...等,将消息传递给DefaultCoordinator进行处理。
那么其它两个接口分别对外提供哪些接口呢?
TCInboundHandler
public interface TCInboundHandler { // 开始全局事务 GlobalBeginResponse handle(GlobalBeginRequest globalBegin, RpcContext rpcContext); // 全局事务提交 GlobalCommitResponse handle(GlobalCommitRequest globalCommit, RpcContext rpcContext); // 全局事务回滚 GlobalRollbackResponse handle(GlobalRollbackRequest globalRollback, RpcContext rpcContext); // 分支事务注册 BranchRegisterResponse handle(BranchRegisterRequest branchRegister, RpcContext rpcContext); // 分支事务上报 BranchReportResponse handle(BranchReportRequest branchReport, RpcContext rpcContext); // 全局锁查询 GlobalLockQueryResponse handle(GlobalLockQueryRequest checkLock, RpcContext rpcContext); // 事务状态查询 GlobalStatusResponse handle(GlobalStatusRequest globalStatus, RpcContext rpcContext); // 全局上报 GlobalReportResponse handle(GlobalReportRequest globalReport, RpcContext rpcContext); }
可以看到,TCInboundHandler主要定义了关于全局事务的begin、commit、rollback,以及分支事务的register、report,附加全局锁查询和两个report。
与全局事务内部相关的在TCInboundHandler中,那么与分支事务内部相关的就分离到了ResourceManagerInbound中
ResourceManagerInbound
public interface ResourceManagerInbound { // 分支事务提交 BranchStatus branchCommit(BranchType branchType, String xid, long branchId, String resourceId, String applicationData) throws TransactionException; // 分支事务回滚 BranchStatus branchRollback(BranchType branchType, String xid, long branchId, String resourceId, String applicationData) throws TransactionException; }
和TCInboundHandler比起来,ResourceManagerInbound中的定义就简单了很多,仅仅是对分支事务的提交和回滚。
总结
DefaultCoordinator作为Server端的核心实现类,实现了TCInboundHandler和ResourceManagerInbound两个接口,分别关于全局事务的处理和分支事务的处理逻辑。