分布式事务Seata
2023-10-22 21:18:13 0 举报
AI智能生成
分布式事务 Seata 二阶段 提交 分布式 事务 面试题
作者其他创作
大纲/内容
概述
分布式事务解决了什么问题
下单业务,前端请求首先进入订单服务,创建订单并写入数据库。然后订单服务调用购物车服务和库存服务:
购物车服务负责清理购物车信息
库存服务负责扣减商品库存,如果,扣减库存失败了怎么办?
我们来做一个测试,先进入购物车页面:
分支主题
目前有4个购物车,然结算下单,进入订单结算页面:
分支主题
然后将购物车中某个商品的库存修改为`0`:
分支主题
然后,提交订单,最终因库存不足导致下单失败:
然后我们去查看购物车列表,发现购物车数据依然被清空了,并未回滚:
事务并未遵循ACID的原则,归其原因就是参与事务的多个子业务在不同的微服务,跨越了不同的数据库。虽然每个单独的业务都能在本地遵循ACID,但是它们互相之间没有感知,不知道有人失败了,无法保证最终结果的统一,也就无法遵循ACID的事务特性了。
这就是分布式事务问题。
什么是分布式事务?
在分布式系统中,如果一个业务需要多个服务合作完成,而且每一个服务都有事务,多个事务必须同时成功或失败,这样的事务就是分布式事务。其中的每个服务的事务就是一个分支事务。整个业务称为全局事务。
出现那些情况就可能产生分布式事务问题:
- 业务跨多个微服务实现
- 业务跨多个数据源实现
有那些分布式事务框架
Seata
解决分布式事务的方案有很多,但实现起来都比较复杂,因此我们一般会使用开源的框架来解决分布式事务问题。在众多的开源分布式事务框架中,功能最完善、使用最多的就是阿里巴巴在2019年开源的Seata了。
Seata
概述
Seata是 2019 年 1 月份蚂蚁金服和阿里巴巴共同开源的分布式事务解决方案。致力于提供高性能和简单易用的分布式事务服务,为用户打造一站式的分布式解决方案。
官网地址:http://seata.io/,其中的文档、播客中提供了大量的使用说明、源码分析。
分支主题
底层实现原理是什么样的?
分支主题
分布式事务产生的一个重要原因,就是参与事务的多个分支事务互相无感知,不知道彼此的执行状态。因此解决分布式事务的思想非常简单:
就是找一个统一的**事务协调者**,与多个分支事务通信,检测每个分支事务的执行状态,保证全局事务下的每一个分支事务同时成功或失败即可。大多数的分布式事务框架都是基于这个理论来实现的。
解决分布式事务,各个子事务之间必须能感知到彼此的事务状态,才能保证状态一致。
Seata事务管理中有三个重要的角色:
TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。
TM (Transaction Manager) - 事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务。
RM (Resource Manager) - 资源管理器:管理分支事务,与TC交谈以注册分支事务和报告分支事务的状态
分支主题
Seata支持四种不同的分布式事务解决方案:
- **XA**
- **TCC**
- **AT**
- **SAGA**
安装部署Seata
准备数据库表
Seata支持多种存储模式,但考虑到持久化的需要,我们一般选择基于数据库存储。导入数据库表:
分支主题
准备配置文件
分支主题
Docker部署
在虚拟机的`/root`目录执行下面的命令:
分支主题
如果镜像下载困难,也可以把课前资料提供的镜像上传到虚拟机并加载:
分支主题
微服务集成Seata
概述
参与分布式事务的每一个微服务都需要集成Seata,我们以`trade-service`为例。
引入依赖
为了方便各个微服务集成seata,我们需要把seata配置共享到nacos,因此`trade-service`模块不仅仅要引入seata依赖,还要引入nacos依赖:
分支主题
改造配置
首先在nacos上添加一个共享的seata配置,命名为`shared-seata.yaml`:
分支主题
内容如下:
分支主题
然后,改造`trade-service`模块,添加`bootstrap.yaml`:
分支主题
内容如下:
分支主题
可以看到这里加载了共享的seata配置。
然后改造application.yaml文件,内容如下:
分支主题
参考上述办法分别改造`hm-cart`和`hm-item`两个微服务模块。
添加数据库表
seata的客户端在解决分布式事务的时候需要记录一些中间数据,保存在数据库中。因此我们要先准备一个这样的表。
将课前资料的seata-at.sql分别文件导入hm-trade、hm-cart、hm-item三个数据库中:
分支主题
结果:
分支主题
OK,至此为止,微服务整合的工作就完成了。可以参考上述方式对`hm-item`和`hm-cart`模块完成整合改造。
测试
找到`trade-service`模块下的`com.hmall.trade.service.impl.OrderServiceImpl`类中的`createOrder`方法,也就是下单业务方法。
将其上的`@Transactional`注解改为Seata提供的`@GlobalTransactional`:
分支主题
`@GlobalTransactional`注解就是在标记事务的起点,将来TM就会基于这个方法判断全局事务范围,初始化全局事务。
我们重启`trade-service`、`item-service`、`cart-service`三个服务。再次测试,发现分布式事务的问题解决了!
XA模式
概述
XA 规范 是 X/Open 组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准,XA 规范 描述了全局的TM与局部的RM之间的接口,几乎所有主流的数据库都对 XA 规范 提供了支持。
分支主题
两阶段提交
目前主流数据库都实现了这种规范,实现的原理都是基于两阶段提交。
0 条评论
下一页