微服务的分布式事务解决方案

微服务的分布式事务解决方案

  • 1、分布式事务的理论模型
    • 1.1、X/Open 分布式事务模型
    • 1.2、两阶段提交协议
    • 1.3、三阶段提交协议
  • 2、分布式事务常见解决方案
    • 2.1、TCC补偿型方案
    • 2.2、基于可靠性消息的最终一致性方案
    • 2.3、最大努力通知型方案
  • 3、分布式事务中间件 Seata
    • 3.1、AT 模式
    • 3.2、Saga 模式

       说起微服务的架构,分布式事务是一道绕不开的话题。本文将从分布式事务的理论模型、分布式事务的常见解决方案、分布式事务中间件 Seata的两个常用模式展开说说分布式事务。

 

1、分布式事务的理论模型

 
两阶段提交协议、三阶段提交 ,作为 XA 协议解决分布式数据一致性问题的基本原理。
 

1.1、X/Open 分布式事务模型

 

X/Open DTP 是 X/Open 定义的一套分布式事务标准,该标准使用两阶段提交来保证分布式事务的完整性。
在这里插入图片描述

X/Open DTP 中包含三种角色

  • ① Application(AP):指应用程序。
  • ② Resource Manager(RM):指资源管理器,比如数据库。
  • ③ Transaction Manager(TM):指事务管理器,事务协调者,负责协调和管理事务,提供AP编程接口或管理RM.

 

1.2、两阶段提交协议

 
两阶段提交协议的执行流程:

  • 准备阶段:TM 通知 RM 准备分支事务,记录事务日志,并告知 TM 的准备结果。
  • 提交/回滚阶段
    • 如果所有的 RM 在准备阶段都明确返回成功,则 TM 向所有的 RM 发起事务提交指令,完成数据变更。
    • 反之,如果任何一个 RM 明确返回失败,则 TM 会向所有 RM 发送事务回滚指令。

在这里插入图片描述

两阶段提交的缺点

  • 同步阻塞

    • 所有参与的 RM 都是事务阻塞型,对于任何一次指令都必须有明确的响应,才能继续进行下一步。
    • 否则会处于阻塞状态,占用的资源一直被锁定。
  • 过于保守:任何一个节点失败都会导致数据回滚。

  • TM 的单点故障:如果 TM 在第二阶段出现故障,那其他参与的RM 会一直处于锁定状态。

  • “脑裂” 导致数据不一致问题:第二阶段中 TM 向所有的 RM 发送 commit 请求后,发生局部网络异常,导致只要一部分 RM 接收到 commit 请求,进而执行了 commit 操作。另一部分 RM 未收到 commit 请求,从而事务无法提交,导致数据不一致问题发生。

 

1.3、三阶段提交协议

 

**三阶段提交协议执行流程**如下:

  • CanCommit(询问阶段):TM 向 RM 发送事务执行请求,询问是否可以完成指令,RM 只需要回答是或者不是即可,不需要做真正的事务操作,该阶段会有超时中止机制。

  • PreCommit(准备阶段):TM 会根据所有 RM 的反馈结果决定是否继续执行。

    • 如果在 CanCommit 阶段所有 RM 都返回可以执行操作,则 TM 会向所有 RM 发送 PreCommit 请求,所有 RM 收到请求后写 redo 和 undo 日志执行事务操作但不提交事务,然后返回 ACK 响应等待 TM 的下一步通知。
    • 如果在 CanCommit 阶段,任意 RM 返回不能执行操作的结果,那 TM 会向所有参与者发送事务中断请求。
  • DoCommit(提交或回滚阶段):该阶段根据 PreCommit 阶段执行的结果,来决定 DoCommit 的执行方式。

    • 如果每个 RM 在 PreCommit 阶段都返回成功,那么 TM 会向所有 RM 发起事务提交指令。
    • 如果任何一个 RM 返回失败,那么 TM 会发起中止指令来回滚事务。
      在这里插入图片描述

相对于二阶段提交协议,三阶段提交协议利用超时机制,解决了同步阻塞问题。两者的区别如下:

  • ① 增加了 CanCommit 阶段,用于询问所有 RM 是否可以执行事务操作并响应,其目的是可以尽早发现无法执行操作而中止后续的行为
  • 在准备阶段之后,TM 和 RM 都引入了超时机制,一旦超时TM 和 RM 会继续提交事务,并且认为处于成功状态,因为在超时情况下事务默认成功的可能性比较大。超时机制避免了资源的永久锁定
     

2、分布式事务常见解决方案

 

2.1、TCC补偿型方案

 

TCC(Try-Confirm-Cancel)是一种两阶段提交的思想,也是一种比较成熟分布式事务一致性解决方案。TCC 补偿型方案将一个完整事务分为三个步骤:

  • Try :该阶段主要是对数据的校验,或者资源的预留。
  • Confirm :该阶段确认真正执行的任务,只操作 Try 阶段预留的资源。
  • Cancel :该阶段是取消执行,释放 Try 阶段预留的资源。

在这里插入图片描述

注意:在某些特殊场景下,比如服务器突然宕机,导致该服务并没有收到 TCC 事务协调器的 Cancel 或者 Confirm 请求,这时 TCC 事务框架会记录一些分布式事务的操作日志,保存分布式事务运行的各个阶段和状态。TCC 事务协调器会根据操作日志进行重试,以达到数据的最终一致性

TCC 服务支持接口调用失败发起重试,所以 TCC 暴露的接口都需要满足幂等性

 

2.2、基于可靠性消息的最终一致性方案

 

       RocketMQ 事务消息模型最核心的机制,就是事务回查。下图可以看出,在 RocketMQ 事务消息模型中,事务是由生产者完成。消息队列的可靠性投递机制,保证了消费者如果没有签收消息,消息队列服务器会重复投递。具体可以参考博文 《RocketMQ 顺序消息和事务消息及其原理》 的 【RocketMQ 的事务消息】部分。

在这里插入图片描述
 

2.3、最大努力通知型方案

 

       最大努力通知也被称为定期校对,是以上【基于可靠性消息的最终一致性方案】的优化版,其引入了本地消息表来记录错误消息,然后加入失败消息的定期校对功能,来进一步保证消息被下游系统消费。
 
在这里插入图片描述

最大努力通知方案步骤:

  • 第一步:消息由系统A投递到中间件

    • ① 业务处理中,操作业务数据入库时,在同一事务中向本地消息表中写一条数据,且数据状态为【未发送】。
    • ② 一般采用定时任务,轮询本地消息表中【未发送】状态的数据,将这部分数据发送到消息中间件。
    • ③ 消息中间件收到消息后,通过消息中间件的返回应答状态,修改本地消息表状态为【发送成功】。
  • 第二步:消息中间件投递到系统B

    • ① 消息中间件收到第一步的消息后,同步投递给相应的下游系统,并触发下游系统的业务执行。
    • ② 当下游系统业务处理成功后,向消息中间件反馈确认应答,消息中间件便可以将消息删除,从而完成该事务。
    • ③ 对于投递失败的消息,利用重试机制进行重试,对于重试失败的,写入错误消息表。
    • ④ 消息中间件需要提供失败消息的查询接口,下游系统会定期查询失败消息。

最大努力通知方案缺点:消息表会耦合到业务系统中,如果没有封装好的解决方案,会增加系统的复杂度。

 

3、分布式事务中间件 Seata

 

Seata 组件作为一种分布式解决方案,提供了 AT、TCC、Saga 和 XA 事务模型。

3.1、AT 模式

 
       AT 模式是基于 XA 模式演化而来的,AT 和 XA 都是两阶段事务模型,但是 AT 和XA 相比,做了很多优化。AT 模式作为 Seata 最主推的分布式事务解决方案。

       AT 模式由 TM、RM 和 TC 三大模块组成,其中 TM 和 RM 作为客户端与业务系统(Application)集成,TC 作为 Seata 的服务器独立部署。AT 模式的执行流程:

  • ① TM 向 TC 注册全局事务,并生成全局唯一的 XID.
  • ② RM 向 TC 注册分支事务,并将其纳入该 XID 对应的全局事务范围。
  • ③ RM 向 TC 汇报资源的准备状态。
  • ④ TC 汇总所有事务参与者的执行状态,决定分布式事务是全部回滚还是提交。
  • ⑤ TC 通知所有 RM 提交/回滚事务。

在这里插入图片描述

       Seata的AT模式在性能、一致性模型、侵入性、依赖性和灵活性以及配置和部署等方面,相对于XA模式进行了显著的改进。这些改进使得AT模式成为了一种更加高效、易用和灵活的分布式事务解决方案。

1. 性能提升

  • 资源锁定周期缩短:XA模式一阶段不提交事务,锁定资源直到二阶段结束才释放,这可能导致性能瓶颈。而AT模式一阶段直接提交事务,不锁定资源,从而缩短了资源锁定周期,提高了系统性能。
  • 减少数据库交互:AT模式通过记录数据快照(undo log)来实现回滚,减少了与数据库的交互次数,进一步提升了性能。

2. 一致性模型

  • 最终一致性 vs 强一致性:XA模式遵循两阶段提交协议,保证事务的强一致性(满足ACID原则)。而AT模式则通过数据快照和全局锁来实现最终一致性,虽然数据不是实时一致的,但在最终状态上保持一致,这种模型在某些场景下可以接受,并且减少了锁的使用,提高了性能。

3. 侵入性降低

  • 代码侵入性:XA模式通常需要业务代码显式地参与事务管理,如调用XA接口等。而AT模式则是一种无侵入的分布式事务解决方案,用户只需关注自己的业务SQL,Seata框架会自动处理事务的二阶段提交和回滚操作,降低了对业务代码的侵入性。

4. 依赖性和灵活性

  • 数据库依赖性:XA模式高度依赖关系型数据库来实现事务的强一致性。而AT模式虽然也依赖数据库,但更多地是通过Seata框架的数据快照和全局锁机制来实现最终一致性,因此对数据库的依赖性和要求相对较低。
  • 灵活性:AT模式提供了更高的灵活性,它支持多种数据库类型(如MySQL、Oracle、PostgreSQL和TiDB等),并且可以根据业务需求进行灵活配置和调整。

 

3.2、Saga 模式

 

       Saga 模式是一种长事务解决方案,其核心思想是将一个业务流程中的长事务,拆分成多个本地短事务。业务流程中的每个参与者都提交真实的提交给本地短事务,当其中一个参与者事务执行失败,则通过补偿机制补偿前面已经成功的参于者。
在这里插入图片描述

       Sage 由一系列 sub-transaction T i 组成,每个 T i 都有对应的补偿动作 C i,补偿动作用于撤销 T i 造成的数据变更结果。每一个 T i 操作都真实的影响数据库。
 
Sage 模式的两种执行方式

  • T1、T2、T3、 … 、T i :这种方式表示所有事务都正常执行。
  • T1、T2、 … 、T j、C j 、… 、C2、C1(其中 0 < j < i):这种方式表示执行到 T j 事务时出现异常,通过补充操作撤销之前所有成功的 sub-transaction.

Sage 提供了两种补偿恢复方式

  • ① 向后恢复:如果任一子事务执行失败,则把之前执行的结果逐一撤销。
  • ② 向前恢复:该恢复方式不进行补偿,而是对失败的事务进行重试,其比较适合于事务必须要执行成功的场景。

Saga 的优劣势

  • 和XA 和 TCC 相比,Saga 的一阶段直接提交本地事务,没有锁等待,性能比较高;在事件驱动的模式下,短事务可以异步执行;补偿机制的实现比较简单。
  • Sage 的缺点是并不提供原子性和隔离性支持,隔离性的影响比较大。比如 业务中赠送了一张优惠券,若用户将优惠券使用了,且事务如果出现异常要回滚就会出现问题。

 
 
 
 
 
 
 
.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/41439.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Postgresql - 用户权限数据库

1、综述 在实际的软件项目开发过程中&#xff0c;用户权限控制可以说是所有运营系统中必不可少的一个重点功能&#xff0c;根据业务的复杂度&#xff0c;设计的时候可深可浅&#xff0c;但无论怎么变化&#xff0c;设计的思路基本都是围绕着用户、部门、角色、菜单这几个部分展…

Django QuerySet对象,filter()方法

filter()方法 用于实现数据过滤功能&#xff0c;相当于sql语句中的where子句。 filter(字段名__exact10) 或 filter(字段名10)类似sql 中的 10 filter(字段名__gt10) 类似SQL中的 >10 filter(price__lt29.99) 类似sql中的 <29.99 filter(字段名__gte10, 字段名__lte20…

程序升级bootloader

文章目录 概述什么是bootloader&#xff1f;为什么用&#xff1f;bootloader启动流程图步骤 下载过程代码获取本地配置信息获取主机传过来的配置信息bootloader发送2给上位机&#xff0c;上位机发送文件给bootloader根据网站复制CRC 烧写flasherase启动编译问题 概述 用keil编…

声明队列和交换机 + 消息转换器

目录 1、声明队列和交换机 方法一&#xff1a;基于Bean的方式声明 方法二&#xff1a;基于Spring注解的方式声明 2、消息转换器 1、声明队列和交换机 方法一&#xff1a;基于Bean的方式声明 注&#xff1a;队列和交换机的声明是放在消费者这边的&#xff0c;这位发送的人他…

Dynamic Web Module facet version问题

The default superclass, "javax.servlet.http.HttpServlet", according to the projects Dynamic Web Module facet version (3.1), was not found on the Java Build Path. 1.右键项目 2.点击Properties 3.点击Java Build Path&#xff0c;右边找到Libraries&…

大模型在营销领域的探索及创新

1 AIGA介绍 2 AIGA在营销领域的 应用和探索 3 总结与展望

docker-compose Install gitlab 17.1.1

gitlab 前言 GitLab 是一个非常流行的开源 DevOps 平台,用于软件开发项目的整个生命周期管理。它提供了从版本控制、持续集成/持续部署(CI/CD)、项目规划到监控和安全的一系列工具。 前提要求 Linux安装 docker docker-compose 参考Windows 10 ,11 2022 docker docker-c…

(ECCV,2022)Mask-CLIP:从CLIP中提取自由密集标签

文章目录 Extract Free Dense Labels from CLIP相关资料摘要引言方法Mask-CLIPMask-CLIP 实验 Extract Free Dense Labels from CLIP 相关资料 代码&#xff1a;https://github.com/chongzhou96/MaskCLIP 论文&#xff1a;https://arxiv.org/abs/2112.01071 摘要 对比语言-…

SprongBoot及其基础应用全套部署脚本和配置

POM.xml配置 </dependencies> <!--skywalking日志监控依赖--><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version>8.5.0</version></dependency&g…

【周末闲谈】AI“抢饭碗”?绝对不是危言耸听

AI是在帮助开发者还是取代他们? 在软件开发领域,生成式人工智能(AIGC)正在改变开发者的工作方式。无论是代码生成、错误检测还是自动化测试,AI工具正在成为开发者的得力助手。然而,这也引发了对开发者职业前景和技能需求变化的讨论。AI究竟是在帮助开发者还是取代他们?…

2024组装一台能跑AI大模型的电脑

title: 2024组装一台能跑AI大模型的电脑 tags: [组装电脑, AI大模型] categories: [其他, 电脑, windows] 这里不写组装步骤&#xff0c;哪里接线&#xff0c;购买什么品牌网上一大堆。 这里只写如何根据你自己的需求&#xff0c;选择合适的、兼容的配件。 概述 需求&#xff…

本地多卡(3090)部署通义千问Qwen2-72B大模型提速实践:从龟速到够用

最近在做文本风格转化&#xff0c;涉及千万token级别的文本。想用大模型转写&#xff0c;在线的模型一来涉及数据隐私&#xff0c;二来又不想先垫钱再找报销。本地的7-9B小模型又感觉效果有限&#xff0c;正好实验室给俺配了4卡3090的机子&#xff0c;反正也就是做个推理&#…

运维系列.Nginx配置中的高级指令和流程控制

运维专题 Nginx配置中的高级指令和流程控制 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/…

ssrf结合redis未授权getshell

目录 漏洞介绍 SSRF Redis未授权 利用原理 环境搭建 利用过程 rockylinux cron计划任务反弹shell 写公钥免密登录 ubuntu 写公钥免密登录 漏洞介绍 SSRF SSRF&#xff08;server side request forgrey&#xff09;服务端请求伪造&#xff0c;因后端未过滤用户输入&…

桂花网蓝牙网关X1000:引领物联网新时代的智能连接

在物联网技术飞速发展的今天&#xff0c;蓝牙网关作为连接蓝牙设备与互联网的关键设备&#xff0c;其性能与稳定性直接影响到物联网系统的整体运行效果。桂花网蓝牙网关X1000凭借其卓越的性能和广泛的应用场景&#xff0c;成为了物联网领域的佼佼者。 一、产品概述 桂花网蓝牙…

使用Ckman部署ClickHouse集群介绍

使用Ckman部署ClickHouse集群介绍 1. Ckman简介 ClickHouse Manager是一个为ClickHouse数据库量身定制的管理工具&#xff0c;它是由擎创科技数据库团队主导研发的一款用来管理和监控ClickHouse集群的可视化运维工具。目前该工具已在github上开源&#xff0c;开源地址为&…

Angluar 实现pdf页面预览以及编辑

之前用过一个pdf预览的lib&#xff0c;并且还支持在线编辑&#xff0c;和直接下载编辑之后的pdf和直接打印&#xff0c;还不错&#xff0c;记录下 PdfShowcase 首先安装依赖 npm install ngx-extended-pdf-viewer 然后引入 import { NgxExtendedPdfViewerModule } from &q…

硅纪元视角 | 中国电信“星辰大模型·软件工厂”,两分钟完成应用开发,效率飞跃!

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展&#xff0c;捕捉行业动态&#xff1b;提供深入的新闻解读&#xff0c;助您洞悉技术背后的逻辑&#xff1b;汇聚行业专家的见解&#xff0c;…

【数据结构】链表带环问题分析及顺序表链表对比分析

【C语言】链表带环问题分析及顺序表链表对比分析 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C语言学习之路 文章目录 【C语言】链表带环问题分析及顺序表链表对比分析前言一.顺序表和链表对比1.1顺序表和链表的区别1.2缓存利用率&#…

Linux基础: 二. Linux的目录和文件

文章目录 二. Linux的目录和文件1.1 目录概要1.2 目录详细说明 二. Linux的目录和文件 1.1 目录概要 command&#xff1a;ls / Linux的文件系统像一棵树一样&#xff0c;树干是根目录&#xff08;/&#xff09;&#xff0c;树枝是子目录&#xff0c;树叶是文件&#xff1b; …