基于Saga的分布式事务调度落地
全文4104字,预计阅读时间12分钟。
用户签到成功、增加用户积分
用户创建兑换物品订单,订单状态为已支付
扣除用户积分
扣减物品库存
创建物流出库单
Try:完成业务的准备工作
Confirm:完成业务的提交工作
Cancel:完成业务的回滚工作
服务调用链路依次执行Try逻辑
如果都正常的话,执行Confirm逻辑,完成整个业务流程
如果部分服务的Try逻辑有问题,会执行Cancel逻辑,撤销之前执行的所有操作
saga:长事务,long live transaction
每个本地事务有对应的补偿事务
执行情况
正常:T1 -> T2 -> T3 -> … -> Tn
异常:T1 -> T2 -> T3(异常)-> C3 -> C2 -> C1
Saga两种恢复策略:
backward recovery,向后恢复,补偿所有已完成的事务(回滚操作)
forward recovery,向前恢复,重试失败的事务,假设每个子事务最终都会成功(重试操作)
Saga事务的优缺点:
优点:模型比TCC更简单,只需业务方提供事务执行接口transaction、事务取消补偿接口cancel
缺点:直接执行事务执行接口transaction,可能有副作用(无论是否回滚,都会执行事务接口的逻辑,举例:A账号向B账号转账,T1事务对A用户扣款,T2事务对B用户加款,T1执行成功,同时产生了一条扣款记录,T2执行失败需要回滚T2和T1,在这个过程中的副作用是A账号能感知到金额变化和扣款记录)
Name:本次流程的名称
OID:请求流程ID,必须唯一
Process:每个子流程的属性简介(类型为list,按照顺序执行)
Transaction:执行事务的流程
Call:服务调用的方式,HTTP调用时传GET、POST等
ServiceName:服务名称
ServiceMethod:调用服务的方法名称,HTTP传请求的URL
Body:POST body,string类型
Query:Get Query,map[string]interfase{}
oid:订单ID, 必传,必须唯一,用于幂等性校验等
Compensate:执行失败的补偿流程
Call:服务调用的方式,HTTP调用时传GET、POST等
ServiceName:服务名称
ServiceMethod:调用服务的方法名称,HTTP传请求的URL
Body:POST body,string类型
Query:Get Query,map[string]interfase{}
oid:订单ID, 必传,必须唯一,用于幂等性校验等
2PC 和 3PC 是一种强一致性事务,不过还是有数据不一致,阻塞等风险,而且只能用在数据库层面。
Saga、TCC是一种补偿性事务的思想,对业务入侵较大,需要业务方实现对应的方法。
本地消息、事务消息和最大努力通知其实都是最终一致性事务,因此适用于一些对时间不敏感的业务。