当前位置: 首页 > article >正文

分布式事务实战 ——Seata 与最终一致性方案

在分布式系统蓬勃发展的当下,各个服务之间相互协作完成复杂业务操作的场景愈发普遍。然而,这种架构下的事务管理成为了一个极具挑战性的问题。分布式事务需要保证在多个服务参与的业务操作中,要么所有操作都成功提交,要么全部回滚,以确保数据的一致性和完整性。本文将深入探讨分布式事务的挑战与理论基础,详细介绍 Seata 这一分布式事务解决方案的核心架构与使用方法,以及最终一致性方案的实践案例。

一、分布式事务的挑战与理论

  1. CAP 定理与 BASE 理论
    • CAP 定理:CAP 定理指出,在一个分布式系统中,一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance)这三个特性无法同时满足,最多只能同时满足其中两个。一致性要求所有节点在同一时刻看到的数据是相同的;可用性意味着每个请求都能得到及时的响应,而不考虑响应的是否是最新数据;分区容错性则是指系统在网络分区(部分节点之间无法通信)的情况下仍能继续提供服务。在实际的分布式系统中,由于网络的不确定性,分区容错性是必须要保证的,因此通常需要在一致性和可用性之间进行权衡。
    • BASE 理论:BASE 理论是对 CAP 定理的进一步拓展,它适用于高并发场景。BASE 理论的核心是基本可用(Basically Available)、软状态(Soft State)和最终一致性(Eventually Consistent)。基本可用表示系统在出现故障时,允许损失部分可用性,如响应时间延长、部分功能不可用等;软状态指系统中的数据可以存在中间状态,不要求数据时刻保持强一致性;最终一致性则强调在一段时间后,系统中所有节点的数据最终会达到一致。这种理论为分布式系统在保证可用性和分区容错性的前提下,提供了一种更灵活的数据一致性解决方案。
  2. 事务模型对比
    • 2PC(两阶段提交):2PC 是一种强一致性的事务模型,它将事务的提交过程分为两个阶段:准备阶段(Prepare)和提交阶段(Commit)。在准备阶段,协调者向所有参与者发送准备请求,参与者执行事务操作,但不提交事务;在提交阶段,如果所有参与者都准备成功,协调者向所有参与者发送提交请求,参与者正式提交事务,否则发送回滚请求。2PC 的优点是实现简单,能够保证事务的强一致性,但它存在单点故障问题,即协调者一旦出现故障,整个事务就无法继续进行,同时在准备阶段,参与者会锁定资源,可能导致长时间的阻塞。
    • TCC(Try - Confirm - Cancel):TCC 是一种柔性事务模型,它通过 Try、Confirm 和 Cancel 三个阶段来实现事务。在 Try 阶段,参与者执行初步的业务操作,预留资源;在 Confirm 阶段,参与者确认提交事务,执行真正的业务操作;在 Cancel 阶段,如果事务需要回滚,参与者取消之前的操作,释放预留的资源。TCC 的优点是对资源的锁定时间较短,能够提高系统的并发性能,但它需要开发者手动实现 Try、Confirm 和 Cancel 接口,开发成本较高。
    • Saga:Saga 是一种长事务补偿机制,适用于跨多个服务的复杂业务流程。它将一个长事务拆分成多个短事务,每个短事务都有对应的补偿操作。当其中某个短事务失败时,Saga 会按照相反的顺序执行之前已执行短事务的补偿操作,以确保数据的一致性。Saga 的优点是适用于复杂的业务场景,对业务的侵入性较小,但它的事务协调逻辑较为复杂,需要通过状态机来管理事务的执行和补偿流程。
二、Seata 的核心架构与使用

  1. Seata 的四种模式
    • AT 模式:AT 模式是 Seata 中最常用的模式,它基于 SQL 反向日志自动回滚,对业务代码无侵入。在 AT 模式下,Seata 会在事务开始时,自动记录当前数据的快照,生成反向 SQL。当事务提交时,如果所有操作都成功,Seata 会直接提交事务;当事务回滚时,Seata 会根据反向 SQL 自动回滚数据,将数据恢复到事务开始前的状态。
    • TCC 模式:TCC 模式需要开发者手动实现 Try/Confirm/Cancel 接口。在事务开始时,首先调用 Try 接口进行资源预留;如果所有服务的 Try 接口都执行成功,再依次调用 Confirm 接口进行事务确认;如果有任何一个服务的 Try 接口执行失败,或者在后续过程中出现异常,会依次调用 Cancel 接口进行事务回滚。
    • Saga 模式:Saga 模式通过状态机管理异步补偿流程。它将一个分布式事务拆分成多个本地事务,每个本地事务都有对应的补偿事务。当某个本地事务执行失败时,Saga 会根据预先定义好的状态机,按照相反的顺序执行之前已执行本地事务的补偿事务,从而保证数据的一致性。
    • XA 模式:XA 模式基于数据库的 XA 协议,是一种强一致性的事务模式。在 XA 模式下,Seata 作为事务协调者,协调多个数据库的事务。它通过与数据库的 XA 接口进行交互,实现对事务的统一管理和控制,确保所有参与事务的数据库要么同时提交事务,要么同时回滚事务。
  2. 部署与配置
    • TC(事务协调器):TC 是独立部署的组件,它负责管理全局事务状态。TC 会记录每个全局事务的开始、提交、回滚等状态信息,并协调各个 RM 之间的事务操作。在部署 TC 时,需要配置其存储方式,如使用文件存储、数据库存储等,同时还需要配置与 RM 和 TM(事务管理器)之间的通信方式和地址。
    • RM(资源管理器):RM 需要集成到业务服务中,负责分支事务的管理。RM 会向 TC 注册分支事务,并在事务执行过程中,根据 TC 的指令执行分支事务的提交或回滚操作。在业务服务中集成 RM 时,需要引入 Seata 的相关依赖,并进行相应的配置,如配置 RM 与 TC 之间的通信地址、事务分组等。
三、最终一致性实践案例

  1. 可靠消息队列
    • RocketMQ 事务消息:RocketMQ 提供了事务消息机制,通过半消息(Half Message)确保本地事务与消息发送的原子性。在发送事务消息时,生产者首先发送半消息,此时消息对消费者不可见。然后生产者执行本地事务,根据本地事务的执行结果,向 RocketMQ 发送 Commit 或 Rollback 请求。如果本地事务执行成功,RocketMQ 会将半消息标记为可投递状态,消费者可以消费该消息;如果本地事务执行失败,RocketMQ 会删除半消息,避免消息被误消费。
    • 消息消费幂等:为了保证消息在消费过程中的幂等性,通常可以通过唯一 ID 或数据库状态去重。在消息中携带唯一 ID,消费者在消费消息前,先检查该 ID 是否已经被消费过,如果已消费则直接返回,不再重复处理。另外,也可以利用数据库的唯一约束,在消费消息时,将消息的关键信息插入到数据库中,如果插入失败,说明该消息已经被消费过,从而实现幂等性。
  2. 最大努力通知
    最大努力通知适用于对一致性要求不严格的场景。在这种方案中,当业务操作完成后,系统会通过定时任务等方式,尽力通知相关的服务进行后续处理。如果通知失败,会进行一定次数的重试。例如,在支付系统中,当用户支付成功后,支付系统会通过最大努力通知的方式,将支付结果通知给订单系统。如果订单系统没有及时收到通知,支付系统会在一定时间内进行重试,直到订单系统成功接收通知或达到最大重试次数。

http://www.kler.cn/a/535989.html

相关文章:

  • nuxt3中报错: `setInterval` should not be used on the server.
  • 【FPGA】 MIPS 12条整数指令 【3】
  • 基于RTOS的STM32游戏机
  • 算法日记12:SC40树状数组(单点修改)
  • Docker 国内最新可用镜像源20250205
  • DeepSeek各版本说明与优缺点分析
  • Cables Finance发布 V1.1 白皮书:开创RWA敞口新范式
  • 第二篇:前端VSCode常用快捷键-以及常用技巧
  • ORACLE 数据库的启动和关闭
  • LLM的Deep Research功能:重构人类认知与创新的新范式
  • SQL Server中RANK()函数:处理并列排名与自然跳号
  • tomcat如何配置保存7天滚动日志
  • NLP知识点
  • 7-1 什么是机器学习
  • C语言数据结构编程练习-排序算法
  • 2.1-STL库中string类的模拟实现
  • DIY Shell:探秘进程构建与命令解析的核心原理
  • 蓝桥杯小白打卡第二天
  • 【大模型LLM面试合集】大语言模型架构_Transformer架构细节
  • java高级工程师面试题_java高级工程师面试题及答案解析
  • 【原子工具】快速幂 快速乘
  • 基于Flask的商城应用系统的设计与实现
  • vscode中的编辑器、终端、输出、调试控制台(转载)
  • 大数据系统文件格式ORC与Parquet
  • 算法设计-四后问题(C++)
  • 力扣54螺旋矩阵