微服务架构 | 11. 分布式事务

简介: 分布式事务是指事务的参与者、支持事务的服务器、资源服务器及事务管理器分别位于分布式系统的不同节点上;

前言

参考资料
《Spring Microservices in Action》
《Spring Cloud Alibaba 微服务原理与实战》
《B站 尚硅谷 SpringCloud 框架开发教程 周阳》

分布式事务是指事务的参与者、支持事务的服务器、资源服务器及事务管理器分别位于分布式系统的不同节点上;


1. 基础知识

1.1 分布式事务问题的理论模型

1.1.1 X/Open 分布式事务模型(XA 协议)

  • X/Open DTP 包含以下三种角色:

    • AP:Application,表示应用程序;
    • RM:Resource Manager,表示资源管理器,比如数据库;
    • TM:Transaction Manager,表示事务管理器,一般指事务协调者,负责协调和管理事务,提供 AP 编程接口或管理 RM 。可以理解为 Spring 中提供的 Transaction Manager;

分布式事务处理 DTP 模型
-TM 和多个 RM 之间的事务控制,是基于 XA 协议(XASpecification)来完成的。XA 协议是 X/Open 提出的分布式事务处理规范,也是分布式事务处理的工业标准,它定义了 xa_ 和 ax_ 系列的函数原型及功能描述、约束等。目前 Oracle、MySQL、DB2 都实现了 XA 接口,所以它们都可以作为 RM;

事务执行流程

1.1.2 两阶段提交协议

  • 两阶段:

    • 事务的准备阶段:事务管理器(TM)通知资源管理器(RM)准备分支事务,记录事务日志,并告知事务管理器的准备结果;
    • 事务的提交或者回滚阶段:如果所有的资源管理器(RM)在准备阶段都明确返回成功,则事务管理器(TM)向所有的资源管理器(RM)发起事务提交指令完成数据的变更。反之,如果任何一个资源管理器(RM)明确返回失败,则事务管理器(TM)会向所有资源管理器(RM)发送事务回滚指令;
  • 优点:简单,降低事务提交失败率;
  • 缺点:同步阻塞(对于任何一次指令都必须要有明确的响应才能继续进行下一步)、过于保守(任何一个节点失败都会导致数据回滚);

两阶段提交协议执行流程

1.1.3 三阶段提交协议

  • 三阶段:

    • CanCommit(询问阶段):事务协调者向参与者发送事务执行请求,询问是否可以完成指令,参与者只需要回答是或者不是即可,不需要做真正的事务操作,这个阶段会有超时中止机制;
    • PreCommit(准备阶段):事务协调者会根据参与者的反馈结果决定是否继续执行,如果在询问阶段所有参与者都返回可以执行操作,则事务协调者会向所有参与者发送 PreCommit 请求,参与者收到请求后写 redo 和 undo 日志,执行事务操作但是不提交事务,然后返回 ACK 响应等待事务协调者的下一步通知。如果在询问阶段任意参与者返回不能执行操作的结果,那么事务协调者会向所有参与者发送事务中断请求;
    • DoCommit(提交或回滚阶段):这个阶段也会存在两种结果,仍然根据上一步骤的执行结果来决定 DoCommit 的执行方式。如果每个参与者在 PreCommit 阶段都返回成功,那么事务协调者会向所有参与者发起事务提交指令。反之,如果参与者中的任一参与者返回失败,那么事务协调者就会发起中止指令来回滚事务;
  • 优点:可以尽早发现无法执行操作而中止后续的行为;在准备阶段后,事务协调者和参与者都引入了超时机制;基于超时机制来避免资源的永久锁定;
  • 缺点:一旦超时,仍然可能出现数据不一致的情况;

三阶段提交协议执行流程

1.2 分布式事务的两个理论模型

1.2.1 CAP 定理

  • 《微服务架构 | 3. 注册中心与服务发现》中讲解的一样,指在分布式系统中不可能同时满足一致性(C:Consistency)、可用性(A:Availability)、分区容错性(P:Partition Tolerance)这三个基本需求,最多同时满足两个;

    • C:数据在多个副本中要保持强一致,比如前面说的分布式数据一致性问题;
    • A:系统对外提供的服务必须一直处于可用状态,在任何故障下,客户端都能在合理的时间内获得服务端的非错误响应;
    • P:在分布式系统中遇到任何网络分区故障,系统仍然能够正常对外提供服务;
  • 网络分区:不同节点分布在不同的子网络中时,在内部子网络正常的情况下,由于某些原因导致这些子节点之间出现网络不通的情况,导致整个系统环境被切分成若干独立的区域,这就是网络分区;
  • 在分布式系统中,不会选择 CA,而是 APCP

    • AP:放弃了强一致性,实现最终的一致,是很多互联网公司解决分布式数据一致性问题的主要选择;
    • CP:放弃了高可用性,实现强一致性。前面提到的两阶段提交和三阶段提交都采用这种方案。可能导致的问题是用户完成一个操作会等待较长的时间;
    • CA:无法同时做到保证数据一致性和可用,要保证数据一致性可能要拒绝客户端请求,除非网络百分百可靠;

1.2.2 BASE 理论

  • BASE 理论是由于 CAP 中一致性 C可用性 A不可兼得而衍生出来的一种新的思想,BASE 理论的核心思想是通过牺牲数据的强一致性来获得高可用性。它有如下三个特性;

    • Basically Available(基本可用):分布式系统在出现故障时,允许损失一部分功能的可用性,保证核心功能的可用;
    • Soft State(软状态):允许系统中的数据存在中间状态,这个状态不影响系统的可用性,也就是允许系统中不同节点的数据副本之间的同步存在延时;
    • Eventually Consistent(最终一致性):中间状态的数据在经过一段时间之后,会达到一个最终的数据一致性;
  • BASE 理论并没有要求数据的强一致,而是允许数据在一段时间内是不一致的,但是数据最终会在某个时间点实现一致;
  • 在互联网产品中,大部分都会采用 BASE 理论来实现数据的一致,因为产品的可用性对于用户来说更加重要;
  • 举个例子,在电商平台中用户发起一个订单的支付,不需要同步等待支付的执行结果,系统会返回一个支付处理中的状态到用户界面。对于用户来说,他可以从订单列表中看到支付的处理结果。而对于系统来说,当第三方的支付处理成功之后,再更新该订单的支付状态即可。在这个场景中,虽然订单的支付状态和第三方的支付状态存在短期的不一致,但是用户却获得了更好的产品体验;

1.3 分布式事务问题的常见解决方案(事务模式)

在互联网场景中更多采用柔性事务,所谓的柔性事务是遵循 BASE 理论来实现的事务模型,它有两个特性:基本可用、柔性状态;

1.3.1 TCC 补偿型方案

  • TCC(Try-Confirm-Cancel)是一种比较成熟的分布式数据一致性解决方案,它实际上是把一个完整的业务拆分为如下三个步骤:

    • Try:这个阶段主要是对数据的校验或者资源的预留(冻结资源);
    • Confirm:确认真正执行的任务,只操作 Try 阶段预留的资源(消耗冻结资源);
    • Cancel:取消执行,释放 Try 阶段预留的资源(解冻资源);
  • 其实 TCC 是一种两阶段提交的思想,第一阶段通过 Try 进行准备工作,第二阶段 Confirm/Cancel 表示 Try 阶段操作的确认和回滚;
  • 在一些特殊情况下,服务并没有收到 TCC 事务协调器的 Cancel 或者 Confirm 请求时,可以记录一些分布式事务的操作日志,保存分布式事务运行各个阶段和状态,以实现一致性;
  • TCC 服务支持接口调用失败发起重试,所以 TCC 暴露的接口都需要满足幂等性;

TCC 方案执行流程

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

  • 基于可靠性消息的最终一致性是互联网公司比较常用的分布式数据一致性解决方案;
  • 它主要利用消息中间件(Kafka、RocketMQ 或 RabbitMQ)的可靠性机制来实现数据一致性的投递;
  • 在某些场景中可以牺牲数据的一致性在短时间内不要求实时性,所以可以采用基于可靠性消息的最终一致性方案来保证最终的数据一致性;
  • 在消费者没有向消息中间件服务器发送确认时,这个消息会被重复投递,确保消息的可靠性消费;
  • RocketMQ 使用事件消息模型解决事务问题,其核心是事务回查,主要逻辑如下:

    • 生产者发送一个事务消息到消息队列上,消息队列只记录这条消息的数据,此时消费者无法消费这条消息;
    • 生产者执行具体的业务逻辑,完成本地事务的操作;
    • 接着生产者根据本地事务的执行结果发送一条确认消息给消息队列服务器,如果本地事务执行成功,则发送一个 Commit 消息,表示在第一步中发送的消息可以被消费,否则,消息队列服务器会把第一步存储的消息删除;
    • 如果生产者在执行本地事务的过程中因为某些情况一直未给消息队列服务器发送确认,那么消息队列服务器会定时主动回查生产者获取本地事务的执行结果,然后根据回查结果来决定这条消息是否需要投递给消费者;
    • 消息队列服务器上存储的消息被生产者确认之后,消费者就可以消费这条消息,消息消费完成之后发送一个确认标识给消息队列服务器,表示该消息投递成功;

RocketMQ 的事件消息模型

1.3.3 最大努力通知型

  • 基于可靠性消息的最终一致性方案类似,适用于对数据一致性要求不高的场景;
  • 在支付服务没有返回一个消息确认时,支付宝会不断进行重试,直到一个消息确认或达到最大重试次数;

最大努力通知型

1.3.4 AT 模式

  • AT 模式是 Seata 最主推的分布式事务解决方案,它是基于 XA 演进而来的一种分布式事务模式。分为三大模块:TM、RM 和 TC(与XA不同)。其中:

    • TM 事务管理器:负责向 TC 注册一个全局事务,并生成一个全局唯一的 XID。作为 Seata 的客户端与业务系统集成;
    • RM 数据库资源:在业务层面通过 JDBC 标准的接口访问 RM 时, Seata 会对所有请求进行拦截。作为 Seata 的客户端与业务系统集成;
    • TC 事务协调器:每个本地事务进行提交时,RM 都会向 TC 注册一个分支事务。作为 Seata 的服务器独立部署;
  • AT 模式和 XA 一样,也是一个两阶提交事务模型;

Seata 的 AT 事务模式

1.3.5 Saga 模式

  • Saga 模式又称为长事务解决方案,主要描述的是在没有两阶段提交的情况下如何解决分布式事务问题;
  • 其核心思想是:把一个业务流程中的长事务拆分为多个本地短事务,业务流程中的每个参与者都提交真实的提交给该本地短事务,当其中一个参与者事务执行失败,则通过补偿机制补偿前面已经成功的参与者;
  • Saga 的机制相关详情请见笔者的另一篇文章:《微服务架构设计模式》读书笔记 | 第4章 使用Saga管理事务

1.5 目前几种流行的分布式事务技术方案对比

名称 厂商 特点(优点) 缺点
Seata Alibaba 对业务无侵入、高性能 Seata 是工作在读未提交的隔离级别,Seata 本身存在一定的性能损耗


2. Seata

Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务;它提供了 AT、TCC、Saga 和 XA 事务模式,为开发者提供了一站式的分布式事务解决方案;



相关文章
|
10月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
1410 3
|
9月前
|
存储 安全 Java
管理 Spring 微服务中的分布式会话
在微服务架构中,管理分布式会话是确保用户体验一致性和系统可扩展性的关键挑战。本文探讨了在 Spring 框架下实现分布式会话管理的多种方法,包括集中式会话存储和客户端会话存储(如 Cookie),并分析了它们的优缺点。同时,文章还涵盖了与分布式会话相关的安全考虑,如数据加密、令牌验证、安全 Cookie 政策以及服务间身份验证。此外,文中强调了分布式会话在提升系统可扩展性、增强可用性、实现数据一致性及优化资源利用方面的显著优势。通过合理选择会话管理策略,结合 Spring 提供的强大工具,开发人员可以在保证系统鲁棒性的同时,提供无缝的用户体验。
193 0
|
人工智能 安全 Java
智慧工地源码,Java语言开发,微服务架构,支持分布式和集群部署,多端覆盖
智慧工地是“互联网+建筑工地”的创新模式,基于物联网、移动互联网、BIM、大数据、人工智能等技术,实现对施工现场人员、设备、材料、安全等环节的智能化管理。其解决方案涵盖数据大屏、移动APP和PC管理端,采用高性能Java微服务架构,支持分布式与集群部署,结合Redis、消息队列等技术确保系统稳定高效。通过大数据驱动决策、物联网实时监测预警及AI智能视频监控,消除数据孤岛,提升项目可控性与安全性。智慧工地提供专家级远程管理服务,助力施工质量和安全管理升级,同时依托可扩展平台、多端应用和丰富设备接口,满足多样化需求,推动建筑行业数字化转型。
435 5
|
8月前
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
微服务架构实战指南:从单体应用到云原生的蜕变之路
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——常见问题总结
本文总结了Spring Boot中使用事务的常见问题,虽然通过`@Transactional`注解可以轻松实现事务管理,但在实际项目中仍有许多潜在坑点。文章详细分析了三个典型问题:1) 异常未被捕获导致事务未回滚,需明确指定`rollbackFor`属性;2) 异常被try-catch“吃掉”,应避免在事务方法中直接处理异常;3) 事务范围与锁范围不一致引发并发问题,建议调整锁策略以覆盖事务范围。这些问题看似简单,但一旦发生,排查难度较大,因此开发时需格外留意。最后,文章提供了课程源代码下载地址,供读者实践参考。
417 0
|
9月前
|
消息中间件 缓存 监控
中间件架构设计与实践:构建高性能分布式系统的核心基石
摘要 本文系统探讨了中间件技术及其在分布式系统中的核心价值。作者首先定义了中间件作为连接系统组件的"神经网络",强调其在数据传输、系统稳定性和扩展性中的关键作用。随后详细分类了中间件体系,包括通信中间件(如RabbitMQ/Kafka)、数据中间件(如Redis/MyCAT)等类型。文章重点剖析了消息中间件的实现机制,通过Spring Boot代码示例展示了消息生产者的完整实现,涵盖消息ID生成、持久化、批量发送及重试机制等关键技术点。最后,作者指出中间件架构设计对系统性能的决定性影响,
|
监控 Linux 应用服务中间件
Linux多节点多硬盘部署MinIO:分布式MinIO集群部署指南搭建高可用架构实践
通过以上步骤,已成功基于已有的 MinIO 服务,扩展为一个 MinIO 集群。该集群具有高可用性和容错性,适合生产环境使用。如果有任何问题,请检查日志或参考MinIO 官方文档。作者联系方式vx:2743642415。
3911 57
|
11月前
|
缓存 Cloud Native Java
Java 面试微服务架构与云原生技术实操内容及核心考点梳理 Java 面试
本内容涵盖Java面试核心技术实操,包括微服务架构(Spring Cloud Alibaba)、响应式编程(WebFlux)、容器化(Docker+K8s)、函数式编程、多级缓存、分库分表、链路追踪(Skywalking)等大厂高频考点,助你系统提升面试能力。
1386 0
|
消息中间件 缓存 算法
分布式开发:数字时代的高性能架构革命-为什么要用分布式?优雅草卓伊凡
分布式开发:数字时代的高性能架构革命-为什么要用分布式?优雅草卓伊凡
1363 0
分布式开发:数字时代的高性能架构革命-为什么要用分布式?优雅草卓伊凡