Seata源码——TCC模式解析03 在分布式系统中,随时随地都需要面对网络超时,网络重发和服务器宕机等问题。所以分布式事务框架作为搭载在分布式系统之上的一个框架型应用也绕不开这些问题。具体而言,有以下常见问题:1.幂等处理2.空回滚3.资源悬挂参考 :https://developer.aliyun.com/article/1053736#
Seata源码——TCC模式解析02 在SpringBoot启动的时候通过自动注入机制将GlobalTransactionScanner注入进ioc而GlobalTransactionScanner继承AbstractAutoProxyCreatorAbstract 在postProcessAfterInitialization阶段由子类创建代理TccActionInterceptor。
Seata源码——TCC模式使用01 TCC 是分布式事务中的二阶段提交协议,它的全称为 Try-Confirm-Cancel,即资源预留(Try)、确认操作(Confirm)、取消操作(Cancel),他们的具体含义如下:Try:对业务资源的检查并预留。Confirm:对业务处理进行提交,即 commit 操作,只要 Try 成功,那么该步骤一定成功。Cancel:对业务处理进行取消,即回滚操作,该步骤回对 Try 预留的资源进行释放。TCC 是一种侵入式的分布式事务解决方案,以上三个操作都需要业务系统自行实现,对业务系统有着非常大的
Seata中AT模式的实现原理04-GlobalLock的作用 Seata(AT 模式)的默认全局隔离级别是 读未提交如果应用在特定场景下,必需要求全局的 读已提交 ,目前 Seata 的方式是通过 SELECT FOR UPDATE 语句的代理。SELECT FOR UPDATE 语句的执行会申请 全局锁 ,如果 全局锁 被其他事务持有,则释放本地锁(回滚 SELECT FOR UPDATE 语句的本地执行)并重试。这个过程中,查询是被 block 住的,直到 全局锁 拿到,即读取的相关数据是 已提交 的,才返回。
Seata中AT模式的实现原理03-二阶段提交 1.当一阶段提交没有任何异常情况下进行二阶段提交 TM会发送提交全局事务请求给TC2.TC接收到全局事务提交请求之后会循环所有的分支事务 往RM发送分支事务提交的请求3.RM接收到分支事务提交请求之后会委派给AsyncWorker去处理 从阻塞队列里面拿数据4.AsyncWorker处理的时候其实就是将undo_log的数据删除5.当RM处理完之后返回TC 然后会将全局锁删除 就是 lock_table表数据6.将分支事务状态变为二阶段已提交。
Seata中AT模式的实现原理02-RM分支事务提交 1.项目启动的时候会为DataSource做增强 当全局事务开启之后执行业务代码的时候会进到DataSource的代理中然后由执行器去做语句的执行2.开启本地事务3.在执行业务语句之前会构建前置镜像 其实就相当于一个 select id from test where 修改条件/删除条件 = xxx for uodate 用于在后续的事务提交中提供数据的一致性保证。以便在事务提交时使用这个镜像来比较和确认事务是否能够成功提交。4. 然后会执行业务代码。
Seata中AT模式的实现原理01-TM开启全局事务 1.项目启动的时候会由SpringBoot自动装配机制把GlobalTransactionScanner装配进spring容器中去做增强并会注入一个全局事务的拦截器2.当有标准了GlobalTransactional的方法被执行的时候会通过拦截器进行拦截进行全局事务的开启3.开启全局事务的之前会先根据不同的事务隔离级别去做不同的处理4.然后TM会通过Netty发送一个开启全局事务的请求到TC。
Seata客户端启动流程 1.客户端启动的时候会通过SpringBoot的自动装配机制加载配置类2.设置RestTemplate的拦截器用来拦截所有mvc请求 和Feign的拦截器拦截Feign请求设置全局事务ID3.初始化TM(事务管理者) RM(资源管理者) 建立Netty客户端的通道并启动4.注册TM 和RM到SeataServer。
Seata服务端启动流程 1.解析registry.conf、file.conf等配置文件2.创建一个监控,做metric指标采集3.创建SeataNettyServer服务端(TC事务协调器) 并设置一个Handler用来处理AT、TCC、SAGA等不同事务类型的逻辑处理4.设置事务持久化方式5.设置全局锁的管理器6.启动Seata服务端 建立和客户端的通道 默认端口为8091。
Nacos源码解读10——配置中心的客户端怎么处理服务端推送的配置信息变更 客户端在启动的时候会构建一个ConfigService的处理类,然后再ConfigService的构造,方法中会创建一个ClientWorker 用来处理对服务端的网络通信及后续变更处理,
Nacos源码解读11——客户端怎么读取最新的配置信息 1.springboot启动的时候会通过自动注入 将NacosPropertySourceLocator注入到bean容器中 然后会调用到locate方法中进行配置的读取2.配置读取会先判断是否配置了自动刷新 如果没有配置则直接从缓存中读取3.如果配置了自动刷新 会先从本地快照中读取 如果读取到了就返回并加入到本地缓存中。
Nacos源码解读09——配置中心配置信息创建修改怎么处理的 1.当从服务端进行配置的新增和修改会先将数据给持久化到内嵌的数据源或者外部的比如mysql中2.然后发送配置变更的事件会将配置通过GRPC协议同步给连接自己的cleint端 和连接集群中其他节点的客户端。