动力节点spingcloud Alibaba学习笔记-第七章分布式事务解决方案Seata

7 分布式事务解决方案Seata

7.1 Seata概述

7.1.1 分布式事务简介

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FtJW6XCX-1691142978646)(https://cdn.nlark.com/yuque/0/2023/png/32441366/1690364252353-b80bca4f-b499-41ed-8137-79ee93c6c688.png#averageHue=%23fefcfb&id=J3RE6&originHeight=455&originWidth=571&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)]
对于分布式事务,通俗地说就是,一次操作由若干分支操作组成,这些分支操作分属不同应用,分布在不同服务器上。分布式事务需要保证这些分支操作要么全部成功,要么全部失败。
能够实现分布式事务的解决方案很多,但阿里Seata则是一个非常成熟的分布式事务产品,Spring Cloud Alibaba推荐使用Seata作为分布式事务解决方案。

7.1.2 Seata简介

以下是来自于Seata官网的介绍:Seata官网: http://seata.io/zh-cn/
Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。
在 Seata 开源之前,Seata 对应的内部版本在阿里经济体内部一直扮演着分布式一致性中间件的角色,帮助经济体平稳地度过历年的双11,对各BU业务进行了有力的支撑。经过多年沉淀与积累,商业化产品先后在阿里云、金融云进行售卖。2019年1月为了打造更加完善的技术生态和普惠技术成果,Seata 正式宣布对外开源,未来 Seata 将以社区共建的形式帮助其技术更加可靠与完备。

7.1.3 Seata架构

7.1.3.1 官方架构图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tl9d6IlC-1691142978649)(https://cdn.nlark.com/yuque/0/2023/png/32441366/1690364252613-4aed6586-d954-4381-9918-23ec3a3fb4d2.png#averageHue=%23faf2dd&id=H56UC&originHeight=691&originWidth=1216&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DT60qkNT-1691142978649)(https://cdn.nlark.com/yuque/0/2023/png/32441366/1690364252994-82728da3-6192-4a85-96be-d49b0dbf2bff.png#averageHue=%23f2e8d6&id=aTQzy&originHeight=458&originWidth=858&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RG8L7Ngc-1691142978649)(https://cdn.nlark.com/yuque/0/2023/png/32441366/1690364253298-254397bc-550c-4c23-b7ac-4500ff9c5f75.png#averageHue=%23fcfbfa&id=Tte6k&originHeight=843&originWidth=1700&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)]
Seata中有三个常用术语:TC、TM与RM。

7.1.3.2 TC

Transaction Coordinator,事务协调者。维护全局和分支事务的状态,驱动全局事务提交或回滚。

7.1.3.3 TM

Transaction Manager,事务管理器。定义全局事务的范围:开始全局事务、提交或回滚全局事务。

7.1.3.4 RM

Resource Manager,资源管理器。管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

7.2 分布式事务模式

Seata提供了XA、AT、TCC与SAGA四种分布式事务模式。

7.2.1 XA模式

7.2.1.1 使用前提

XA模式使用的前提条件有:

  • 基于XA事务的数据库。
  • Java 应用,通过 JDBC 访问数据库。
7.2.1.2 模式架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-71fi8j7r-1691142978650)(https://cdn.nlark.com/yuque/0/2023/png/32441366/1690364253635-81ae8220-8c54-42db-9732-f8d1d94c22f3.png#averageHue=%23efbe43&id=A1i1d&originHeight=924&originWidth=1330&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)]
XA(UniX TransAction)是一种分布式事务解决方案,一种分布式事务处理模式,是基于XA协议的。XA协议由Tuxedo(Transaction for Unix has been Extended for Distributed Operation,分布式操作扩展之后的Unix事务系统)首先提出的,并交给X/Open组织,作为资源管理器与事务管理器的接口标准。

7.2.1.3 存在的问题

XA模式存在两个问题:

  • 回滚日志无法自动清理,需要手工清理。
  • 多线程下对同一个RM中的数据进行修改,存在ABA问题。

7.2.2 AT模式

7.2.2.1 使用前提

AT模式使用的前提条件为:

  • 基于支持本地 ACID 事务的关系型数据库。
  • Java 应用,通过 JDBC 访问数据库。
7.2.2.2 模式架构

AT,Automatic Transaction。AT模式是Seata默认的分布式事务模型,是由XA模式演变而来的,通过全局锁对XA模式中的问题(ABA问题)进行了改进,并实现了回滚日志的自动清理。

7.2.2.3 存在的问题

AT模式也存在两个问题:

  • 不支持NoSQL。
  • 全局commit/rollback阶段及回滚日志的清除过程,完全“自动化”无法实现定制化过程。

7.2.3 TCC模式

7.2.3.1 模式架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SEMuvIeO-1691142978650)(https://cdn.nlark.com/yuque/0/2023/png/32441366/1690364253945-fbf91e56-b0a3-46f2-a7fa-81698aecc3bd.png#averageHue=%2347704c&id=NUWU6&originHeight=482&originWidth=853&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)]
TCC,Try Confirm/Cancel,同样也是2PC的,其与AT的重要区别是,支持将自定义的分支事务纳入到全局事务管理中,即可以实现定制化的日志清理与回滚过程。当然,该模式对业务逻辑的侵入性是较大的。

7.2.3.2 官方解释

什么意思呢?查看官方给出的解释:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GerqSlHr-1691142978650)(https://cdn.nlark.com/yuque/0/2023/png/32441366/1690364254216-95fcd6c5-c6ac-4f67-8ae5-1a03a2d72631.png#averageHue=%23fdf8f6&id=xPdqy&originHeight=591&originWidth=1099&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)]
第一段(红框上的内容)的意思是,对于2PC模式,分支事务分为AT模式与TCC模式。
下面的两部分则是给出了AT模式与TCC模式的区别:我们可以看出,它们的区别就体现在“自动” “自定义”上:TCC的prepare、commit、rollback逻辑都是自定义的,而AT中的都是自动的,执行系统定义好的逻辑。

7.2.4 2PC先天缺陷

2PC最大的特点是简单(原理简单、实现简单),但也存在着不少的先天缺陷。例如,同步阻塞、中心化问题、数据不一致、太过保守……。

7.2.5 Saga模式

对于架构复杂,且业务流程较多较长的系统,一般不适合使用2PC的分布式事务模式。因为这种系统一般无法提供TM、TC、RM三种接口。此时,我们可以尝试着选择Saga模式。

7.2.5.1 模式架构

Saga模式是1987年由普林斯顿大学的Hector Garcia-Molina和Kenneth Salem共同提出的。该模式不同于前面的模式,它不是2PC的,其是一种长事务解决方案。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mTPquwlM-1691142978650)(https://cdn.nlark.com/yuque/0/2023/png/32441366/1690364254533-14dfc684-6f6e-4b3e-8b14-b5ef53bfe681.png#averageHue=%23f7e9e9&id=SFDb5&originHeight=444&originWidth=445&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)]
其应用场景是:在无法提供TC、TM、RM接口的情况下,对于一个流程很长的复杂业务,其会包含很多的子流程(事务)。每个子流程都让它们真实提交它们真正的执行结果。只有当前子流程执行成功后才能执行下一个子流程。若整个流程中所有子流程全部执行成功,则整个业务流程成功;只要有一个子流程执行失败,则可采用两种补偿方式:

  • 向后恢复:对于其前面所有成功的子流程,其执行结果全部撤销
  • 向前恢复:重试失败的子流程直到其成功。当然这个前提是要确保每个分支事务都能够成功。

如何保证不发生脏读呢?当子流程在提交了执行结果后,可根据业务场景为业务逻辑加锁或为资源加锁。

7.2.5.2 与2PC模式的区别
  • Saga模式的所有分支事务是串行执行的,而2PC的则是并行执行的。
  • Saga模式没有TC,其是通过子流程间的消息传递来完成全局事务管理的,而2PC则具有TC,其是通过TC完成全局事务管理的。

7.3 测试环境搭建

对于Seata的用法,通过官方的给出的场景来举例说明。

7.3.1 需求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wu1LQSOD-1691142978651)(https://cdn.nlark.com/yuque/0/2023/png/32441366/1690364255005-871d243d-a7ff-4512-b31c-e5b4c89bd329.png#averageHue=%23fbecc1&id=S92Ji&originHeight=508&originWidth=864&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)]
按照官方架构示例先搭建一下后续要进行Seata用法测试的代码环境。
这里要定义Stock(id, goodsId, total)、Order(id, userId, goodsId, goodsPrice, count)、Account(id, userId, balance)与Business等至少四个工程。Business消费Stock与Order服务,Order同时也消费Account服务。另外,Stock、Order与Account分别连接着mysql1、mysql2与mysql3三个DBMS,且均采用JPA作为ORM。

7.3.2 Stock工程07-ec-stock-8081

7.3.2.1 定义工程

复制03-provider-nacos-config-8081工程,并重命名为07-ec-stock-8081。将原来工程中除了启动类外所有类删除,保留原有的POM与配置文件。

7.3.2.2 定义实体类Stock

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GQfGLY2k-1691142978651)(https://cdn.nlark.com/yuque/0/2023/png/32441366/1690364255357-18c5e53d-a46f-4590-8470-efc746ede1c5.png#averageHue=%23fdfdfc&id=BvDkj&originHeight=542&originWidth=982&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)]

7.3.2.3 定义StockRepository接口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vpvIwyXY-1691142978651)(https://cdn.nlark.com/yuque/0/2023/png/32441366/1690364255600-84d5e2b6-25be-4106-bd9b-dcaabeabbb62.png#averageHue=%23fcfbfb&id=Qn0PE&originHeight=195&originWidth=919&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)]

7.3.2.4 定义StockService接口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WmI4XSGD-1691142978651)(https://cdn.nlark.com/yuque/0/2023/png/32441366/1690364255828-7631e01d-3c30-42bc-98c4-c80fbd3fbc63.png#averageHue=%23fbfafa&id=EMziM&originHeight=197&originWidth=686&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)]

7.3.2.5 定义StockServiceImpl类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eix7iu0l-1691142978652)(https://cdn.nlark.com/yuque/0/2023/png/32441366/1690364256050-2efe3cda-730b-41c9-935d-52cae56178d0.png#averageHue=%23fcfbfb&id=OOboM&originHeight=737&originWidth=812&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)]

7.3.2.6 定义StockController类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZiTlDA8R-1691142978652)(https://cdn.nlark.com/yuque/0/2023/png/32441366/1690364256292-a31418f8-e6bb-412d-9913-4fed0bc8ba2d.png#averageHue=%23fcfcfb&id=NKWna&originHeight=505&originWidth=909&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)]

7.3.2.7 定义启动类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bG3C4iyr-1691142978652)(https://cdn.nlark.com/yuque/0/2023/png/32441366/1690364256549-38e68b05-dce1-4ff5-8c8f-ff13de7de6fe.png#averageHue=%23fdfcfb&id=M3AIQ&originHeight=344&originWidth=763&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)]

7.3.2.8 修改配置文件

这里仅修改微服务名称与其连接的数据库,指定其连接的为mysql1主机。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-etCuSaWg-1691142978652)(https://cdn.nlark.com/yuque/0/2023/png/32441366/1690364256792-30868769-f07b-4489-aa04-66e0f945810d.png#averageHue=%23fcfcfb&id=l5Cna&originHeight=818&originWidth=1198&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)]

7.3.2.9 DB中添加数据

在Nacos启动的前提下,直接启动该工程即可。启动后在mysql主机的test数据库中就可看到stock表。在表中插入一条记录。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MD4sFpQO-1691142978653)(https://cdn.nlark.com/yuque/0/2023/png/32441366/1690364257051-42a48e12-3045-4cef-a62d-7397aeae47e8.png#averageHue=%23f4f3f1&id=EKaS3&originHeight=198&originWidth=581&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)]

7.3.2.10 访问

在浏览器提交PUT请求,对goodsId为2的商品消费count为5个后,的确使库存少了5个。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1GYH2xPR-1

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值