分布式事务框架 seata
2022-04-08 17:41:58 48 举报
AI智能生成
Seata是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。它为用户提供了AT、TCC、SAGA和XA事务模式,为用户打造一站式的分布式解决方案。Seata将为用户提供高效、可靠且对业务无侵入的分布式事务服务,推进微服务架构的落地与推广。 Seata具有以下特点: - 支持多种事务模式:AT、TCC、SAGA和XA。 - 高性能:通过优化SQL语句和锁机制,提高系统性能。 - 简单易用:提供简洁的API和丰富的文档,方便用户快速上手。 - 可靠性高:采用多种手段保证数据的一致性和可靠性。
作者其他创作
大纲/内容
分布式事务框架 seata
定义
⼀个开源的分布式事务框架, 由阿⾥中间件团队发起的
开源项⽬Fescar,后更名为Seata
开源项⽬Fescar,后更名为Seata
组成
TC(总监)
Transaction Coordinator 事务协调器,管理全局的
分⽀事务的状态,⽤于全局性事务的提交和回滚。
TM(项目经理)
Transaction Manager 事务管理器,⽤于开启、提交
或者回滚【全局事务】。
RM(小组组长)
Resource Manager 资源管理器,⽤于分⽀事务上的
资源管理,向TC注册分⽀事务,上报分⽀事务的状态,接
受TC的命令来提交或者回滚分⽀事务
与传统TX协议的区别
传统XA协议实现2PC⽅案的 RM 是在数据库层,RM本
质上就是数据库⾃身;
Seata的RM是以jar包的形式嵌⼊在应⽤程序⾥⾯
架构:TC 为单独部署的 Server 服务端,TM 和 RM 为嵌
⼊到应⽤中的 Client 客户端
原理流程图(生命周期结合流程图理解)
seata
对⽐X/OpenDTP事务模型
工作模式类似server/client 模式
其它术语
XID(全局事务的ID,贯穿整个事务)
TM 请求 TC 开启⼀个全局事务, TC 会⽣成⼀个 XID
作为该全局事务的编号XID, XID会在微服务的调⽤链
路中传播,保证将多个微服务的⼦事务关联在⼀起
生命周期
事务过程
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
AT模式可以应对⼤多数的业务场景,并且基本可以
做到⽆业务⼊侵、开发者⽆感知
⽤户只需关⼼⾃⼰的 业务SQL. AT 模式分为两个阶
段,可以认为是2PC
⼀阶段:执⾏⽤户SQL
⼆阶段:Seata框架⾃动⽣成提交或者回滚
TCC(三阶段-3PC 需要自编译代码)
Sage(长链路服务调用)
XA(两阶段 2PC)
安装、部署、使用
基于AT模式
创建undo_log表, 每个库都需要
http://seata.io/zh-cn/docs/dev/mode/at-mode.html
下载部署Seata的TC服务端
http://seata.io/zh-cn/blog/download.html
我们下载1.3就⾏,不要下载最新的(除⾮对新的很有
把握不出问题)
seata目录讲解
bin
conf
file.conf
持久化模式配置
## store mode: file、db、redis
mode = "file" #默认file
mode = "file" #默认file
lib
logs
Linux/Mac/Windows服务器安装
解压
修改jvm内存(默认是2g,防⽌内存不够)
./seata-server.sh 启动,默认是8091端⼝(记得防⽕
墙开放端⼝,也可以nohup守护进程启动)
TC需要存储全局事务和分⽀事务的记录,⽀持三种存储模
式
file模式 (默认):性能⾼, 适合单机模式,在内存中读
写,并持久化到本地⽂件中
在 bin/sessionStore/root.data⽂件
db模式 :性能差,适合tc集群模式
redis模式:性能教⾼,适合tc集群模式
配置修改
seata 也可以整合其他注册中心使用
问题:
seata 在 JDK11下运⾏报错
解决: 下载下来的seata 默认没有存放⽇志⽂件的⽬录,
⼿动创建seata/logs/seata_gc.log ⽬录和⽂件
maven 包冲突
seata 客户端和服务端的版本必须一致 否则会出现service null
解决
问题: 微服务场景下,配置了统⼀全局异常处理,导致
seata在AT模式下⽆法正常回滚问题(拓展如果使⽤Feign 配置了容错类(fallback)或者容错⼯⼚
(fallbackFactory),也是⼀样的问题)
seata在AT模式下⽆法正常回滚问题(拓展如果使⽤Feign 配置了容错类(fallback)或者容错⼯⼚
(fallbackFactory),也是⼀样的问题)
原因:服务A调⽤服务B, 服务B发⽣异常,由于全局异常
处理的存在(@ControllerAdvice), seata ⽆法拦截到B服
务的异常,从⽽导致分布式事务未⽣效
解决思路
配置了全局异常处理,所以rpc⼀定会有返回值, 所以在每个全
局事务⽅法最后, 需要判断rpc是否发⽣异常
发⽣异常则抛出 RuntimeException或者⼦类
⽅式⼀:RPC接⼝不配置全局异常
⽅式⼆:利⽤AOP切⾯解决
⽅式三:程序代码各⾃判断RPC响应码是否正常,再抛出异常
引入seata 包后当上游服务使用@transaction 注解 也能起到和@GlobalTransaction一样的效果
高并发下分布式事务的选择思考
分布式事务解决⽅案很多,XA的2PC、TCC、MQ事务消息
等
框架也有Seata, 同时⽀持多种⽅式模式
重点
不管选哪⼀种⽅案,在项⽬中应⽤都要谨慎再思考,
除特定的数据强⼀致性场景外,能不⽤尽ᰁ就不要⽤
因为⽆论它们性能如何优越,⼀旦项⽬链路加⼊分布式事务
整体效率会⼏倍的下降,在⾼并发情况下弊端尤为明显
任何多链路的操作,换个⽅案或者换个思路,可以避免使
⽤分布式事务
下单商品库存锁定
下单优惠券记录锁定
总之
分布式事务和分布式锁⼀样,能不⽤就不⽤
实在要⽤,使⽤优先是 柔性事务,实在⽆法满⾜再考虑
刚性事务
分布式锁也是,尽量降低锁的粒度
0 条评论
下一页