既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
为了能够解决发生异常时,各个子系统数据不一致的情况,我们是不是可以参考分布式事务呢?分布式事务是如何处理的,这里以Seata为例,看看它是如何处理的。
上图是SEATA的分布式解决方案,这里有3个角色:TC、TM、RM
- TC (Transaction Coordinator) - 事务协调者
维护全局和分支事务的状态,驱动全局事务提交或回滚。 - TM (Transaction Manager) - 事务管理器
定义全局事务的范围:开始全局事务、提交或回滚全局事务。 - RM (Resource Manager) - 资源管理器
管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
这里不过多的深入SEATA,更多可以参考官方文档。
实现自己三方事务
看了SEATA的分布式事务后,为了解决多方子系统数据一致性问题,同样也需要一个TC和TM,由于我们无法对第三方子系统进行任何操作,除了根据它的方法结果进行处理,因此这里不需要RM,我定义了一下TC和TM的职责:
- TC:维护全局和三方事务的状态,驱动全局事务提交或回滚。
- TM:定义全局事务的范围:开始全局事务、处理事务方法、提交或回滚全局事务。
同时为了能够让TM知道哪些接口需要处理事务,定义了一个注解ApiTx,有如下特性:
- rollBackMethod:定义回退方法,不支持多参数
- field:定义入参、出参字段映射
- dependMethod:定义该接口依赖的接口,比如删除接口发生异常,回退方法为新增接口,依赖查询接口
定一个GlobalApiTx注解,用于开启全局事务,具有如下特性:
- timeoutMills:回退超时时间,这里不支持
- name:第三方接口事务名称
- retryTimes:回退重试次数, 暂不支持
在介绍了TC、TM和两个自定义注解后,看一下自己实现三方事务的整体框架:
一共有4个模块:事务处理器,回退处理器,日志记录,业务逻辑。
- 事务处理器(TC):具有一个注解ApiTx 用于标注需要处理的回退接口,该注解具有三个参数:反向回退方法、前置依赖方法、字段映射;一个全局事务注解GlobalTx用于标注该方法内所有三方接口是一个统一的事务,发生异常后需要统一回滚处理。
- 回退处理器™:接收事务处理器的异常事件,通过ApiTx解析出反向接口、前置依赖方法、映射字段,调用反向接口对各子系统的脏数据进行处理。
- 日志记录:记录正向接口请求记录和反向接口请求记录
- 业务逻辑:处理其他相关的业务逻辑
有了整体框架图后,下面是该三方事务的具体流程图:
- 具体的,该装置随Spring启动,启动后监听GlobalTx和ApiTx注解的方法;
- 然后,拦截切点,进行前置处理,包括创建事务、处理回退依赖方法。
- 然后,执行第三方API接口,不发生异常,正常处理业务逻辑,记录日志,返回结果;发生异常,捕获异常,进入回退处理器,记录日志。
- 然后,回退处理器,获取回退方法,处理关联字段,填充参数;前置条件处理完毕后,执行第三方回退API,记录API执行时间、监听回退API超时时间,超时进行重试处理;如果在执行回退API的时候发生异常,抛出回退异常,提示用户进行手动处理;如果成功执行回退API,则抛出业务异常,记录日志。
- 最后,结束整个事务。
总结
该方法是一种用于保证多方子系统数据一致性的方法,优点是通过全局事务注解,异常回退统一处理,不侵入业务,可以作为通用逻辑处理,不耦合业务。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新