分布式事务(Saga模式)

分布式事务(Saga模式)(解决mq,api分布式事务问题)

一 概览
1.分布式事务包含两个组件TxServer和TxClient

TxServer是分布式事务协调器,主要负责接收每个参与者事务开启和结束的上报信息,并做持久化。协调补偿子事务,达到事务的最终一致。
TxClient是分布式事务客户端,主要负责上报事务开启和结束结果信息。

2.业务接入

业务服务需要引入TxClient依赖

<dependency>
    <groupId>com.mw</groupId>
    <artifactId>mw-transaction-client-starter</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <exclusions>
        <exclusion>
            <groupId>com.mw</groupId>
            <artifactId>mw-transaction-common</artifactId>
        </exclusion>
    </exclusions>
</dependency>
3.api接口接入分布式事务

在这里插入图片描述

4.分布式事务应用案例

1.由服务A开启分布式事务,生成全局事务Id以及服务A的本地事务Id,上报到协调器开启事务。
2.服务A开始执行业务,调用服务B
3.服务B开启本地事务,上报到协调器
4.服务B执行业务
5.服务B业务执行完成,向协调器上报本地事务执行结果,服务B本地事务结束
6.服务B返回数据给服务A
7.服务A继续执行后续业务
8.服务A执行完成,向协调器上报全局事务执行结果,全局事务结束

5.成功场景:

所有服务都执行成功,协调器记录所有事务为已完成状态。

服务B异常场景:
B服务发生异常,A服务也会发生异常,AB两个子事务都是异常状态,不需要补偿。

服务A在服务B执行成功后发生异常场景:
服务B本地事务为成功状态,服务A本地事务发生异常,全局事务异常,补偿服务B业务,使服务B本地事务和全局事务达到一致。

服务B执行超时场景:
服务A在调用服务B时发生超时,则服务A本地事务发生异常,全局事务异常。此时服务可能还没执行完,协调器会定期扫描。如果服务B最终执行失败,则不进行补偿,最终执行成功,则进行补偿。

接入代码示例:
在服务A接口上添加@SagaStart注解,开启分布式事务

@GetMapping("/test")
@SagaStart(serviceName = "mw-crm-service-biz2")
public String test() throws Exception {
    UserDTO userDTO = new UserDTO();
    userDTO.setUserName("ACE");
    userDTO.setAge(20);
    crm1Api.service1(userDTO);
    return "success";
}
在服务B接口上添加@TxCompensation注解,成为事务链的子事务。

参数compensationServiceName为全局事务发生异常后,协调器调用的补偿服务,compensationServicePath则为补偿接口路径,补偿接口参数直接拿原接口的参数

@PostMapping("/service1")
@TxCompensation(serviceName = "mw-crm-service-biz1", compensationServiceName = "mw-crm-service-biz1", compensationServicePath = "/crm1/compen/service1")
public String service1(@RequestBody UserDTO userDTO) {
    return "service1";
}

@GetMapping("/service3")
@TxCompensation(serviceName = "mw-crm-service-biz1#service3", compensationServiceName = "mw-crm-service-biz1", compensationServicePath = "/crm1/compen/service3")
public String service3(@RequestParam("userName") String userName, @RequestParam("age") Integer age) {
    return "service3";
}
业务补偿接口规范:
如果业务接口请求参数为对象实体,补偿接口通过json对象接收参数

@PostMapping("/compen/service1")
public ApiResult compenService(@RequestBody UserDTO userDTO) {
    log.info("完成补偿1{}", userDTO);
    return ApiResult.build(Code.Code_Success.getName(), Code.Code_Success.getValue());
}
如果业务接口请求参数为String或者基础数据类型,补偿接口使用restful方式接收
@PostMapping("/compen/service3/{p1}/{p2}")
public ApiResult compenService2(@PathVariable String p1, @PathVariable Integer p2) {
    log.info("完成补偿p1{}, p2{}", p1, p2);
    return ApiResult.build(Code.Code_Success.getName(), Code.Code_Success.getValue());
}

二 分布式事务Client中间件的原理

1.首先拦截@SagaStart和@TxCompensation 注解开启事务

在这里插入图片描述

2.执行wrapper中apply方法

目的:开启事务 上报主事务
在这里插入图片描述
createStartTxEvent方法:组装补偿数据(服务名称,url,方法,参数,token等数据)
createBaseTxEnent方法:上报事务组装数据(同上)
exePreIntercept方法:执行上报逻辑(采用rpc框架中的ThriftClient类似于openFeign等常见rpc)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.执行wrapper中compensation方法

目的:开启子事务
执行逻辑和同上
在这里插入图片描述

三 分布式事务Client中间件的原理

1.定时任务对需要补偿的事务进行补偿

在这里插入图片描述

2.调用checkByGlobalTxId进行事务补偿

在这里插入图片描述

2.调用compensationHandler进行事务补偿

在这里插入图片描述
执行补偿逻辑

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: SAGA模型是一种在分布式事务场景中跨微服务管理数据一致性的方法。它由一系列事务组成,用于更新每个服务并触发下一个事务步骤的消息或事件。如果某个步骤失败,则SAGA将执行补偿事务,以抵消上一个事务的影响。 SAGA模型的设计考虑了分布式事务中的失败和超时情况,通过执行补偿事务来维护数据一致性。在DTM中,如果TransIn返回失败,依然需要调用TransIn的补偿操作。这是为了保持简单和统一的设计考虑,同时也考虑到了单服务多数据源的情况,确保补偿被调用并执行。DTM提供了子事务屏障,自动处理了补偿操作中的各种情况,用户只需要执行与正向操作完全相反的补偿即可。 SAGA模型和DTM的设计使得分布式事务的处理更加灵活和可靠,能够应对各种异常情况。123 #### 引用[.reference_title] - *1* [分布式事务模型--Saga](https://blog.csdn.net/qq_31960623/article/details/119393747)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] - *2* [Saga 分布式事务模式](https://blog.csdn.net/weixin_37604985/article/details/127469987)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] - *3* [分布式事务SAGA事务模式】](https://blog.csdn.net/u010359479/article/details/130951276)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值