拆解seata:分布式事务解决方案
2024-02-22 16:45:07 0 举报
AI智能生成
拆解seata:分布式事务解决方案 什么是ACID? 举个需要分布式事务的例子? 什么是CAP?什么是AP和CP? BASE理论是什么? Seata有哪4种事务模式?各自的实现过程,优缺点有哪些? 怎么实现TC服务的异地容灾高可用?
作者其他创作
大纲/内容
原子性:全部成功或全部失败
一致性:保证数据库的完整性约束
隔离型:统一资源操作的事务不同时发生
持久性:永久保存,不受故障影响
ACID原则
订单服务:创建订单
用户服务:扣减余额
库存服务:扣减商品库存
例子:下单
一个业务跨越多个服务或数据源,每个服务都是一个单独的事务,要保证所有分支事务最终状态一致
分布式事务
Consistency 一致性:访问任意节点的同一数据需要一致
Availability 可用性:访问任意健康节点必须得到响应
Partition tolerance 分区容错性:因为网络问题,某节点与其他节点失联,形成独立分区
C-A-P
分布式系统一定会出现P问题
ES是CP还是AP?CP
CAP
Basically Available 基本可用:节点故障,允许损失部分可用性,保证 核心可用
Soft State 软状态:允许出现中间状态(临时不一致)
Eventually Consistent 最终一致性:软状态结束后,最终达到数据一致
BA-S-E
BASE
各个子事务分别执行及提交
短时间内允许出现结果不一致
需实现最终一致
AP模式:最终一致
子事务分别执行后互相等待
子事务间需要相互通信
同时提交,同时回滚
事务等待过程中,处于弱可用
CP模式:强一致性
理论
2019年1月 蚂蚁开源
TC 事务协调者 重事务协调
TM 事务管理器 重事务执行
RM 资源管理器 重资源管理
架构
XA模式 强一致性
AT模式 最终一致性
TCC模式 最终一致性
SAGA模式 长事务模式
解决方案
seata基本信息
RM注册事务
RM执行SQL但是不提交
RM报告事务状态
一阶段
TC通知RM提交或回滚
二阶段
过程
强一致性
无代码侵入,实现简单
优点
需要锁,性能差
依赖关系型数据库
缺点
XA
RM执行SQL并提交
RM记录更新后快照 undolog
都成功,TC删除log
有失败,基于log回滚,删除log
线程1将payment由100改为90
线程2将payment将90改为80
线程1将payment回滚为100
丢失了更新
全局锁(TC记录);全局锁300ms
记录两个快照,回滚的时候做比较,有不对就人工介入
解决
脏写问题
性能较好
全局锁来实现写隔离
无代码侵入
有软状态,最终一致
快照影响性能
AT
try:资源监测和预留
confirm:资源操作
cancel:预留资源的释放
性能优势。每个阶段都是直接提交
不依赖数据库事务。可用于非事务型数据库
有代码侵入
软状态,最终一致
需要考虑confirm cancel的幂等
幂等
未try,先cancel
空回滚
已经cancel,再try
业务悬挂
增加分支事务状态:记录分支事务状态:try | confirm | cancel
问题
账户A余额100,扣除30
try:冻结30
confirm:冻结金额扣减30
cancel:冻结金额减少30,可用余额增加30
逻辑
@LocalTCC
@TwoPhaseBusinessAvtion
@BusinessActionContextParameter
RootContext.getXid()
关键
1、扣减可用金额 account表
2、记录冻结金额,事务状态 account_freeze表
业务悬挂:xid的cancel记录存在,直接返回
try
1、获取事务ID ctx.getXid()
2、删除冻结金额 account_freeze表
confirm
1、恢复可用金额 account表
2、清零冻结金额,更新状态 account_freeze表
空回滚:若freeze记录不存在,插一条cancel状态的freeze记录
幂等:若freeze记录已经是cancel,直接返回
cancel
实现
举例
TCC
一阶段:直接提交本地事务
二阶段:成功则什么都不做。失败则通过补偿业务来回滚
基于事件驱动实现异步调用
一阶段直接提交、无锁、性能好
实现简单
软状态时间不确定,时效性差
没有锁、没有事务隔离、会有脏写
事务跨度大的场景
场景少
场景
SAGA
XA强一致
AT、TCC弱一致
SAGA 最终一致
一致性
XA完全隔离
AT基于全局锁隔离
TCC基于资源预留隔离
SAGA隔离
隔离性
XA、AT 无
TCC、SAGA有
代码侵入
TCC =SAGA > AT >XA
性能
XA 强一致性、隔离性
AT 大多数都可以
TCC 对性能要求高的场景
SAGA 业务流程长,业务多,包含外部服务
对比
seata事务模式详解
部署集群,如:HZ、SH
nacos配置client.properties,配置HZ服务组
业务微服务seta配置修改,应用 client.properties
业务微服务自动连到HZ服务组
client.properties 修改到SH
业务微服务自动连到SH服务组
微服务动态找到集群
TC服务异地多机房容灾
seata
收藏
0 条评论
回复 删除
下一页