seata原理源码分析(二)事务模式-TCC(一) 织入拦截器,rpc,资源分析
简介
SEATA是阿里巴巴开源的分布式事务解决方案,用于解决分布式系统中的数据一致性问题。分布式系统,数据存储在不同的资源管理器(数据库),需要保证分布式事务的原子性,业界比较常用xa,数据库标准实现,严格的一致性,但性能差,不符合当前互联网系统高吞吐,高并发的要求。Seata提供最终一致性的分布式事务解决方案,牺牲严格一致性,允许一定时间的不一致,获得高性能。
seata支持tcc,saga,at,xa ,本文分析seata的tcc事务模式,based seata v2.0.0,
分3篇:1 织入拦截器, rpc,资源分析
2 事务流程,包括tm启动全局事务,rm注册事务分支,执行业务逻辑,rm报告分支状态,tm结束事务,tc通知rm结束事务,rm结束事务
3 健壮性 fence组件,幂等、悬挂和空回滚
关键词
分布式事务
严格一致性
最终一致性
Transaction Coordinator(TC):负责全局事务的生命周期管理和协调,保证所有分支事务的一致性。
Transaction Manager(TM):负责分支事务的提交和回滚,接受TC的指令并执行相应的全局事务操作。
Resource Manager(RM):负责本地事务的提交和回滚,与TM进行通信,执行相应的分支事务操作。
参考资料
seata官方网站 https://seata.apache.org/
技术架构
上图是seata的技术架构,分4个内容部分,事务框架流程,应用端组件(左侧),服务组件(右侧),功能组件
事务框架流程
技术架构图展示事务框架流程,
1、开启全局事务,使用@GlobalTransactional方法调起执行切面,向TC注册全局事务,TC生成XID,返回给TM
2、分支事务注册,通过切面向业务服务置入逻辑,业务服务调用前执行,注册分支事务,从TC获得分支事务ID,TC根据XID将分支事务与全局事务关联
3、分支事务报告,业务服务执行自身业务逻辑,例如执行sql,写入数据库,若成功,通知TC分支事务成功
步骤3,4通常多个业务服务
4、全局提交事务或回滚,分支服务全部成功,TM通知TC全局事务成功;否则,通知TC全局事务失败;
5、分支事务提交或回滚, TC收到全局事务的结果,若成功,则通知RM成功,RM收到通知后执行清理工作;如果失败了,则RM进行回滚。
总述,seata的框架流程是通用分布式事务流程,各模式”塞”进框架内,为了维持表面上的“团结”,seata内部使用了很多的设计,下面及后面章节详细分析。
TCC
本节分析tcc模式的原理和源码
织入tcc拦截器
织入tcc拦截器是seata初始化的核心工作,seata使用aop机制,无侵入方式安插自身的事务逻辑到用户的业务
上图是织入拦截器相关用例,大致两个事情
- 分析资源(bean,方法),返回合适切面,织入切面
- 向tc注册
类图
下图织入拦截器的类图
GlobalTransactionScanner 继承AbstractAutoProxyCreator,该类是spring aop包的成员,主要方法wrapIfNecessary,继承类覆盖该方法,按自身需要,通常类类型或注解,对类型织入切面,seata使用该机制织入切面
@GlobalTransactional和@TwoPhaseBusinessAction tcc相关的两个注解,前者织入全局事务的拦截器GlobalTransactionalInterceptorHandler;后者插入分支事务的拦截器TccActionInterceptorHandler
AdapterSpringSeataInterceptor spring aop的拦截器适配实现,适配seata自身机制的handler,这样设计可以让seata自身的handler使用其他织入框架,如,google juice
GlobalTransactionalInterceptorHandler 处理事务全局的拦截器,后面章节详细分析
TccActionInterceptorHandler tcc分支事务的拦截器
InterfaceParser分析bean的类型信息,注解信息,选择适当的拦截器,tcc模式的InterfaceParser实现是TccActionInterceptorParser,该分析器还负责资源注册
rpc框架
本节简单介绍rpc框架,研读过阿里系组件源码的都知道,阿里的开源组件的rpc设计很类似,如之前研究过的raft组件dledger,sentinel,flink,总体来说3要素,NettyRemotingClient,NettyRemotingServer,处理器
Seata,tc是rpc的server端, tm,rm是client
TC侧
tc处理器处理来自tm,rm的消息
NettyRemotingServer
上图是tc处理tm,rm远程请求的处理器的注册点,也是分析tc端关键入口,从消息类型(MessageType) 知道消息的用途,
ServerOnRequestProcessor只是门面,实际处理交给TransactionMessageHandler处理,该类的实现类DefaultCoordinator,消息处理代码有点绕,主要是适配几种模式,获取上下文,这里不深入分析。
TM侧
相应地,tm侧处理器注册,可以看到消息类型大部分带“RESULT”,处理tc返回的消息
TmNettyRemotingClient
RM侧
rm 资源管理器,消息处理器处理来自tc的指令或者处理结果
RmNettyRemotingClient
资源分析
本节介绍资源分析,资源分析是配合aop机制,分析spring管理的bean,筛选出目标bean,获取 seata注解,方法类型信息,决定哪种事务模式,使用哪个拦截器
上图资源分析的类图,分析器主要作用是返回织入的拦截器
GlobalTransactionScanner前面介绍过,负责检测spring管理对象是否参与分布式事务,织入seata逻辑,检测工具是资源(对象)分析器,InterfaceParser
DefaultInterfaceParser使用spi机制聚合分析器实现,遍历探测,直到解释成功。
GlobalTransactionalInterceptorParser 分析全局事务,查看方法是否有@GlobalTransactional,返回全局事务拦截器GlobalTransactionalInterceptorHandler,负责处理全局事务,全局锁
TccActionInterceptorParse 检查方法是否有@TwoPhaseBusinessAction,该注解带tcc的commit/rollback方法名称的属性,返回TccActionInterceptorHandler,tcc的拦截器
GlobalTransactionalInterceptorHandler是全局事务拦截器,所有事务模式都使用到,TccActionInterceptorHandler是tcc拦截器
*xa/at没有分支的切面,而是使用jdbc代理织入分支逻辑
> 注册资源
tcc资源是资源管理器服务,注册资源是注册资源管理器服务,tcc模式注册资源在分析资源里,
*xa/at是在数据源代理注册,tcc是服务型的模式,不需要代理数据源,因此放在分析资源方法。
tcc注册资源做两个事情,
1 本地缓存tcc注解定义的commit/rollback方法,后续分支的commit和rollback使用到
2 注册到tc,后续tc与rm通讯
!注意区分,资源注册和分支注册,资源是参与事务的角色,但此时并不涉及事务,而分支注册已是事务中,参与者是资源
系列
- 事务框架流程 分析参与框架流程的组件,tm,rm,协调core 完成
- 事务模式 tcc 本文
- 事务模式at NEXT
- 事务模式xa NEXT
- 事务模式saga saga是处理超长事务模式,事务分成多段,执行中记录执行路径,执行过程遇到异常,根据策略可向前重试,或向后回滚,需要辅助记录,seata的解决方案是预置长事务流程,本人觉得可用性不强,本系列不作分析