文章目录
- 1 saga分布式事务框架
- 1.1 分布式事务相关理论
- 1.1.1 分布式事务的出现
- 1.1.2 CAP定理
- 1.1.3 BASE定理——CAP的解决思想
- 1.1.4 分布式事务四种模式
- 1.1.5 XA、AT与TCC模式
- 1.1.6 Saga模式
- 1.2 分布式事务框架ElegentACTX对Saga模式的解决
- 1.2.1 ElegentACTX介绍
- 1.2.2 ElegentACTX快速入门
- 1.2.2.1 引入maven坐标
- 1.2.2.2 添加分布式事务的数据存储
- 1.2.2.3 实现思路
- 1.2.3 ElegentACTX实现原理
1 saga分布式事务框架
1.1 分布式事务相关理论
1.1.1 分布式事务的出现
什么是分布式事务:在分布式式系统中,一个大操作由同小操作组成,这些小操作属于不同服务器和应用,而在分布式中需要保证这些小操作要么全部成功,要么全部失败,以保证不同数据库的数据一致性。
==========================================================================
如下方用户下单调用链路图:
1.1.2 CAP定理
指标 | 解释 |
---|---|
C (Consistency)一致性 | 用户访问分布式系统中任意节点,得到的数据必须一致。 |
A(Availability) 可用性 | 用户访问集群中任意健康节点,必须得到响应,而不是超时或拒绝。 |
P(Partition tolerance ) 分区容错性 | 由于网络等原因造成集群中部分节点与其他节点失去连接,形成独立分区 |
CAP定理中:三个指标不能同时满足:
在通信链路中,假设N1、N2间网络突然断开,此时有两种解决思路:
①保证系统高可用( A ),牺牲
数据一致性(C
):牺牲数据的一致性,响应旧的数据给用户。即满足AP,保证系统的高可用。
②牺牲
系统可用性(A
),阻塞等待数据一致( C ):牺牲系统的可用性,阻塞等待网络恢复通信,直到网络恢复,在响应给用户。
注意:针对CA
来说,CA的出现会在单体项目中。
1.1.3 BASE定理——CAP的解决思想
BASE:Basically Available(
基本可用
)、Soft State(软状态
)以及Eventually Consistent(最终一致性
)的缩写。
思想 | 解释 |
---|---|
Basically Available(基本可用 ) | 分布式系统在出现故障时,允许损失部分可用性,即保证核心业务可用 |
Soft State(软状态 ) | 在一定时间内,允许出现中间状态,比如临时的不一致状态 |
Eventually Consistent(最终一致性 ) | 在软状态结束后,最终达到数据一致。 |
1.1.4 分布式事务四种模式
解决方案 | 解释 |
---|---|
XA模式 | 强一致性分阶段事务模式,牺牲一定可用性,无业务侵入。 |
AT模式 | 最终一致性分阶段事务模式无业务侵入,Seata默认模式。 |
TCC模式 | 最终一致性分阶段事务模式,有业务侵入。 |
SAGA模式 | 最终一致性分阶段长事务模式,有业务侵入,Saga模式一阶段会提交本地事务,无锁,长流程下可以保证性能多用于渠道层、集成业务系统。事务参与者可以是其它公司服务或者遗留系统的服务,无法进行改造和提供TCC要求的接口时,也可使用Saga模式。 |
1.1.5 XA、AT与TCC模式
参考:分布式事务·入门与解决·壹
1.1.6 Saga模式
在上述sage模式的简略架构图中:
- ① 首先,A调用B,B调用C,在调用过程中,必须编写与业务方法逻辑相反回滚方法(C处于链路末梢,不用编写回滚,由自己本地事务进行回滚)。
- ② 若C的业务在执行过程中发现异常,首先由自己的本地事务进行回滚。
- ③ 同时统一事务协调器会通知A、B微服务执行回滚方法。
1.2 分布式事务框架ElegentACTX对Saga模式的解决
1.2.1 ElegentACTX介绍
ElegentACTX (异步分布式事务框架)是基于ElegentAC(异步调用框架)的分布式事务框架。
与传统的通过MQ异步调用的分布式事务相比较,通常使用消息一致性解决,但是,代码不易维护,特别是在链路复杂的情况下。
1.2.2 ElegentACTX快速入门
1.2.2.1 引入maven坐标
<dependency>
<groupId>cn.elegent</groupId>
<artifactId>elegent-ACTX</artifactId>
<version>1.0.0</version>
</dependency>
1.2.2.2 添加分布式事务的数据存储
elegent:
data:
type: redis
redis:
nodes: 127.0.0.1:6379
password:
1.2.2.3 实现思路
- ① 为了方便代码维护,我们通常会把主事务和子事务都定义成常量。
- ② OrderServiceImpl的vendout方法上添加注解@ACTransaction,指定主事务与子事务名称,OrderServiceImpl的vendout方法将出货数据保存到快照(ElegentACTXContext.setSnapshot方法)。
- ④ 订单添加事务回滚类,创建类实现RollBackHandler接口,类添加@RollBack注解,指定主事务和子事务名称。
- ⑤ doRollBack回滚方法的逻辑:修改订单状态为出货失败 修改支付状态为退款中,发起退款。
1.2.3 ElegentACTX实现原理
说明:
- ① 可以将上图分成两条线路来看,绿色线路表示程序正常执行情况,红色表示发生异常后组件调用情况。
- ② 绿色线路中,用户在业务方法上加@ACTransation注解会被框架统一协调器(类似Seata中的TC)进行增强,统一事务协调器(类似Seata中的TC)根本是一个AOP切面类,在这个业务方法开始、结束、开始回滚、回滚完成等每个生命周期节点,都会调用事务存储器将这些信息记录到数据库。
- ③ 红色箭头中,当某方法发生异常时,会调用事务管理器(类似Seata中的TM)实现方法的回滚,这时候就需用到ElegentAC框架,ElegentACTX依赖于ElegentAC,通过ElegentAC向每个微服务节点发送回滚消息,每个微服务会由回滚消息分发处理器调用回滚方法,这里使用到
策略模式
。
组件 | 说明 |
---|---|
分布式事务协调器 | 根据事务注解信息创建对象,将事务信息存储在统一事务存储器中。 |
统一事务管理器 | 当业务执行过程出现异常时,由统一事务管理器发送回滚消息。 |
统一事务存储器 | 框架核心数据存储器(数据库),封装事务存储数据存储逻辑。 |
回滚消息分发处理器 | 接收到统一书屋管理器发送的回滚消息是,由回滚消息非法处理器分发具体的回滚处理类来进行处理。 |
ElegentData | Elegent的基础组件,为Elegent诸多框架提供存储服务,在ElegentACTX中存储事务数据和快照数据(数据库)需用到。 |
ElegentAC | 异步调用框架,ElegentACTX与ElegentAC 做回滚消息的发送。 |