项目
博客
文档
归档
资源链接
关于我
项目
博客
文档
归档
资源链接
关于我
28| 分布式事务框架Seata
2024-08-13
·
·
原创
·
·
本文共 312个字,预计阅读需要 2分钟。
分布式事务框架 * TX-LCN:支持2PC、TCC等多种模式 * https://github.com/codingapi/tx-lcn * 更新慢(个人感觉处于停滞状态) * Seata:支持 AT、TCC、SAGA 和 XA 多种模式 * https://github.com/seata/seata * 背靠阿里,专门团队推广 为啥选择Seata呢 * git地址 * https://github.com/seata/seata * 背靠阿里,专门团队推广和技术团队 * 已经线上大规模使用且没出现重大漏洞 * 和主流微服务框架轻松整合 * 社区活跃度高、文档齐全、功能强大 * 有专门的阿里云商业化产品GTS,可以无缝迁移 什么是Seata * 一个开源的分布式事务框架, 由阿里中间件团队发起的开源项目Fescar,后更名为Seata * 中文文档地址 * http://seata.io/zh-cn/ 详细介绍: 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。在 Seata 开源之前,Seata 对应的内部版本在阿里经济体内部一直扮演着`分布式一致性中间件的角色`,帮助经济体平稳的度过历年的双11,对各BU业务进行了有力的支撑。经过多年沉淀与积累,商业化产品先后在阿里云、金融云进行售卖。2019.1 为了打造更加完善的技术生态和普惠技术成果,Seata 正式宣布对外开源,未来 Seata 将以社区共建的形式帮助其技术更加可靠与完备. ### Seata核心组件和术语 * **Seata主要由三个重要组件组成:** * TC:Transaction Coordinator 事务协调器,管理全局的分支事务的状态,用于全局性事务的提交和回滚。 * TM:Transaction Manager 事务管理器,用于开启、提交或者回滚【全局事务】。 * RM:Resource Manager 资源管理器,用于分支事务上的资源管理,向TC注册分支事务,上报分支事务的状态,接受TC的命令来提交或者回滚分支事务 * 传统XA协议实现2PC方案的 RM 是在数据库层,RM本质上就是数据库自身; * Seata的RM是以jar包的形式嵌入在应用程序里面 * **架构:TC 为单独部署的 Server 服务端,TM 和 RM 为嵌入到应用中的 Client 客户端** 其它术语 * XID * TM 请求 TC 开启一个全局事务, TC 会生成一个 XID 作为该全局事务的编号XID, XID会在微服务的调用链路中传播,保证将多个微服务的子事务关联在一起 ### Seata事务处理过程描述 * 一个典型的事务过程包括: * A服务的TM 向 TC 申请开启(Begin)一个全局事务,全局事务创建成功并生成一个全局唯一的 XID。 * A服务的RM向TC注册分支事务 * A服务执行分支事务,对数据库做操作 * A服务开始远程调用B服务,并把XID 在微服务调用链路的上下文中传播。 * B服务的RM向TC注册分支事务,并将其纳入XID对应的全局事务的管辖 * B服务执行分支事务,向数据库做操作 * 全局事务调用链处理完毕,TM 根据有无异常向 TC 发起针对 XID 的全局提交(Commit)或回滚(Rollback)决议。 * TC 调度 XID 下管辖的全部分支事务完成提交(Commit)或回滚(Rollback)请求。 Seata 实现分布式事务,关键角色UNDO_LOG(回滚日志记录表) 在每个应用需要分布式事务的业务库中创建这张表,这个表的核心作用是将业务数据在更新前后的数据镜像组织成回滚日志,保存在UNDO_LOG表中,以便业务异常能随时回滚 ### seata的AT模式流程 * `Seata`有四种模式: (简单了解即可,深入的话看分布式事务专题) * AT * AT模式可以应对大多数的业务场景,并且基本可以做到无业务入侵、开发者无感知 * 用户只需关心自己的 业务SQL. AT 模式分为两个阶段,可以认为是2PC - 一阶段:执行用户SQL ```java Seata 会拦截“业务 SQL”,找到“业务 SQL”要更新的业务数据,在业务数据被更新前,将其保存成“before image”,然后执行“业务 SQL”更新业务数据 在业务数据更新之后,再将其保存成“after image”,最后生成行锁 以上操作全部在一个数据库事务内完成,这样保证了一阶段操作的原子性 ``` - 二阶段:`Seata`框架自动生成提交或者回滚 ```java 二阶段提交: 因为“业务 SQL”在一阶段已经提交至数据库, 所以 Seata 框架只需将阶段一保存的快照数据和行锁删掉,完成数据清理即可。 二阶段回滚: 还原业务数据, 回滚方式便是用“before image”还原业务数据; 但在还原前要首先要校验脏写,对比“数据库当前业务数据”和 “after image” 如果两份数据完全一致就说明没有脏写,可以还原业务数据,如果不一致就说明有脏写,出现脏写就需要转人工处理 ``` * TCC * Sage * XA