分布式事务调研

news2025/1/6 20:40:57

目录

需求背景:

本地事务

分布式基本理论

1、CAP 定理

2、BASE理论

分布式事务方案

#2PC

#1. 运行过程

#1.1 准备阶段

#1.2 提交阶段

#2. 存在的问题

#2.1 同步阻塞

#2.2 单点问题

#2.3 数据不一致

#2.4 太过保守

3PC

#本地消息表

TCC

TCC原理

开源的TCC解决方案

Seata的TCC 模式



需求背景:

  • 随着微服务的拆分,服务进行多节点分布式部署,当一个服务节点的业务操作,必须其他几个服务节点的操作成功,才能提交时,就涉及到分布式事务问题;
  • 事务就是要不一起成功提交,要不一起失败回滚;
  • 当然涉及到分布式事务,其业务操作的链路就会比较长,业务执行的时间就会可能比较长,可能就会长期持有数据库连接,导致连接数占满,导致服务异常,这个就是长事务问题;
  • 所以像秒杀等电商高并发场景,为了用户体验好,接口响应快,就不得不做数据的最终一致性处理,做分布式事务维持强一致性可能得不偿失。
  • 比如采用缓存进行库存扣减,如果缓存扛不住,可以进行库存分片,分布在多个缓存节点进行扣减,然后利用MQ、延迟队列+任务调度更新趋势库存,满足最终一致,后续可以扫描统计订单数量,来校准库存。
  • 比如抽奖场景,用户抽中奖后进行发奖,在写入奖品记录的时候,写入一条中奖奖品和用户信息的 task 消息发送任务,作为补偿使用。当 MQ发送失败的时候,则由任务调度扫描 task 消息进行重新发送,发奖服务进行消费MQ消息进行发奖操作,操作成功后修改task消息表中的状态,也就是利用本地消息表+异步回调来实现最终一致性。
  • 当然这里分析调研分布式事务的解决方案,比如两阶段提交2PC、TCC

参考:分布式事务概述与项目实战

本地事务

ACID:数据库事务的几个特性:原子性(Atomicity )、一致性( Consistency )、隔离性或独立性( Isolation)和持久性(Durabilily)

● 原子性:一系列的操作整体不可拆分,要么同时成功,要么同时失败

● 一致性:事务在开始前和结束后,数据库的完整性约束没有被破坏

● 隔离性:事务的执行是相互独立的,它们不会相互干扰,一个事务不会看到另一个正在运行过程中的事务的数据

● 持久性:一个事务完成之后,事务的执行结果必须是落盘在数据库持久

分布式基本理论

1、CAP 定理

CAP是指一致性(Consistency)、可用性(Availability)和分区容忍性(Partition Tolerance)三个属性,它们是分布式系统设计中的重要概念。

● 一致性(Consistency):

在分布式系统中的所有数据结点,在同一时刻是否同样的值。如果在某个节点更新了数据,那么在其他节点如果都能读取到这个最新的数据,那么就称为强一致,如果有某个节点没有读取到,那就是分布式不一致;

● 可用性(Availability):

在集群中一部分节点故障后,非故障的节点在合理的时间内返回合理的响应。合理的时间指的是请求不能无限被阻塞,应该在合理的时间给出返回;合理的响应指的是系统应该明确返回结果并且结果是正确的;

● 分区容错性(Partition tolerance):

系统能够在节点之间发生网络分区(Partition)的情况下仍然能够正常运行;

在分布式系统中,网络无法100%可靠,分区其实是一个必然现象,如果我们选择了CA而放弃了P,那么当发生分区现象时,为了保证一致性,这个时候必须拒绝请求,但是A又不允许,所以分布式系统理论上不可能选择CA架构,只能选择CP或者AP架构。

对于CP来说,放弃可用性,追求一致性(强一致性)和分区容错性;对于AP来说,放弃一致性,追求分区容错性和可用性,这是很多分布式系统设计时的选择,BASE是根据AP来扩展。在实际应用中,网络延迟和不可靠性是不可避免的,数据复制和同步需要一定的时间。因此,即使选择了保证一致性和分区容忍性(CP),在发生网络分区时,节点之间的数据复制可能会产生一定的延迟,导致节点之间的数据不一致,所以很多业务场景我们退而求用户能接受时间延迟的最终一致方案。

2、BASE理论

根据CAP定理,如果要完整的实现事务的ACID特性,只能放弃可用性选择一致性,然而可用性在现在互联网环境至关重要,BASE 理论是对 CAP 中一致性和可用性权衡的结果,是CAP中AP的一个扩展。其核心思想是:强一致性无法得到保障时,我们可以根据业务自身的特点,采用适当的方式来达到最终一致性。BASE 是 Basically Available(基本可用)、Soft state(软状态)和 Eventually consistent (最终一致性)三个短语的缩写。

● BA:(Basically Available)基本可用性,分布式系统在面对故障或分区的情况下,仍然能够保证基本的可用性。即系统可以继续运行并提供核心的功能,而不是完全崩溃;

● S:(Soft State)软状态,分布式系统中的数据状态不需要实时保持一致,而是允许一段时间的数据不一致。数据状态可以是中间状态,可以根据系统自身的需要而变化,这种状态允许一定的延迟和不一致性;

● E:(Eventually Consistency)最终一致性,经过一段时间后数据最终会达到一致状态,但不要求实时的一致性。

分布式事务方案

指事务的操作位于不同的节点上,需要保证事务的 ACID 特性。

例如在下单场景下,库存和订单如果不在同一个节点上,就涉及分布式事务。

分布式锁和分布式事务区别:

  • 锁问题的关键在于进程操作的互斥关系,例如多个进程同时修改账户的余额,如果没有互斥关系则会导致该账户的余额不正确。
  • 而事务问题的关键则在于事务涉及的一系列操作需要满足 ACID 特性,例如要满足原子性操作则需要这些操作要么都执行,要么都不执行。

#2PC

两阶段提交(Two-phase Commit,2PC),通过引入协调者(Coordinator)来协调参与者的行为,并最终决定这些参与者是否要真正执行事务。

#1. 运行过程
#1.1 准备阶段

协调者询问参与者事务是否执行成功,参与者发回事务执行结果。询问可以看成一种投票,需要参与者都同意才能执行。

#1.2 提交阶段

如果事务在每个参与者上都执行成功,事务协调者发送通知让参与者提交事务;否则,协调者发送通知让参与者回滚事务。

需要注意的是,在准备阶段,参与者执行了事务,但是还未提交。只有在提交阶段接收到协调者发来的通知后,才进行提交或者回滚。

#2. 存在的问题
#2.1 同步阻塞

所有事务参与者在等待其它参与者响应的时候都处于同步阻塞等待状态,无法进行其它操作。

#2.2 单点问题

协调者在 2PC 中起到非常大的作用,发生故障将会造成很大影响。特别是在提交阶段发生故障,所有参与者会一直同步阻塞等待,无法完成其它操作。

#2.3 数据不一致

在提交阶段,如果协调者只发送了部分 Commit 消息,此时网络发生异常,那么只有部分参与者接收到 Commit 消息,也就是说只有部分参与者提交了事务,使得系统数据不一致。

#2.4 太过保守

任意一个节点失败就会导致整个事务失败,没有完善的容错机制。

3PC

3PC,三阶段提交协议,是二阶段协议的改进版本,三阶段提交有两个改动点:

  1. 在协调者和参与者中都引入超时机制

  2. 在第一阶段和第二阶段中插入一个准备阶段保证了在最后提交阶段之前各个参与节点的状态是一致的

所以3PC会分3个阶段,CanCommit准备阶段,PreCommit预提交阶段,DoCommit提交阶段,处理流程如下:

图片

参考:分布式事务——三阶段提交|3PC

#本地消息表

本地消息表与业务数据表处于同一个数据库中,这样就能利用本地事务来保证在对这两个表的操作满足事务特性,并且使用了消息队列来保证最终一致性。

  1. 在分布式事务操作的一方完成写业务数据的操作之后向本地消息表发送一个消息,本地事务能保证这个消息一定会被写入本地消息表中。
  2. 之后将本地消息表中的消息转发到消息队列中,如果转发成功则将消息从本地消息表中删除,否则继续重新转发。
  3. 在分布式事务操作的另一方从消息队列中读取一个消息,并执行消息中的操作。

TCC

TCC原理

• Try: 尝试执行阶段,完成所有业务可执行性的检查(保障一致性),并且预留好事务需要用到的所有业务资源(保障隔离性)。

• Confirm: 确认执行阶段,不进行任何业务检查,直接使用Try阶段准备的资源来完成业务处理。注意,Confirm阶段可能会重复执行,因此需要满足幂等性。

• Cancel: 取消执行阶段,释放Try阶段预留的业务资源。注意,Cancel阶段也可能会重复执行,因此也需要满足幂等性。

开源的TCC解决方案

1、tcc-transactionByteTCChmilyspring-cloud-rest-tcc

分布式事务Seata原理2、Seata:分布式事务Seata原理

Seata 是一款开源的分布式事务解决方案,致力于提供高性能与简单易用的分布式事务服务,为用户提供了 AT、TCC、SAGA 和 XA 几种不同的事务模式。

Seata 的核心组件:

在 Seata 中主要有以下三种角色,其中 TM 和 RM 是作为 Seata 的客户端与业务系统集成在一起,TC 作为 Seata 的服务端独立部署:

  • 事务协调器(TC):维护全局事务的运行状态,负责协调并驱动全局提交或回滚

  • 事务管理器(TM):事务发起方,控制全局事务的范围,负责开启一个全局事务,并最终发起全局提交或回滚全局的决议

  • 资源管理器(RM):事务参与方,管理本地事务正在处理的资源,负责向 TC 注册本地事务、汇报本地事务状态,接收 TC 的命令来驱动本地事务的提交或回滚

Seata的TCC 模式

图片

TCC 模式 RM 驱动分支事务的行为分为以下两个阶段:

(1)执行阶段:

  • ① 向 TC 注册分支。

  • ② 执行业务定义的 Try 方法。

  • ③ 向 TC 上报 Try 方法执行情况:成功或失败。

(2)完成阶段:

  • 全局提交,收到 TC 的分支提交请求,执行业务定义的 Confirm 方法。

  • 全局回滚,收到 TC 的分支回滚请求,执行业务定义的 Cancel 方法。

参考:

分布式事务Seata原理

【分布式事务】-TCC分布式事务实现原理

分布式事务解决方案详解九:TCC(两阶段型、补偿型)

如何用TCC实现分布式事务?

Spring Boot集成Seata实现基于AT模式的分布式事务

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

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

相关文章

win10系统部署RAGFLOW+Ollama教程

本篇主要基于linux服务器部署ragflowollama,其他操作系统稍有差异但是大体一样。 一、先决条件 CPU ≥ 4核; RAM ≥ 16 GB; 磁盘 ≥ 50 GB; Docker ≥ 24.0.0 & Docker Compose ≥ v2.26.1。 如果尚未在本地计算机&#xff…

自然语言处理期末试题汇总

建议自己做,写完再来对答案。答案可能存在极小部分错误,不保证一定正确。 一、选择题 1-10、C A D B D B C D A A 11-20、A A A C A B D B B A 21-30、B C C D D A C A C B 31-40、B B B C D A B B A A 41-50、B D B C A B B B B C 51-60、A D D …

Android Studio的AI工具插件使用介绍

Android Studio的AI工具插件使用介绍 一、前言 Android Studio 的 AI 工具插件具有诸多重要作用,以下是一些常见的方面: 代码生成与自动补全 代码优化与重构 代码解读 学习与知识获取 智能搜索与资源推荐实际使用中可以添加注释,解读某段代…

iQOO Neo10系列携三大蓝科技亮相,性能与续航全面升级

11月29日,iQOO Neo10系列正式登场。作为iQOO Neo系列的最新力作,Neo10系列不仅延续了该系列一贯的“双芯”特色,更在性能、续航、屏幕、影像等多个方面实现了全面升级,为用户带来前所未有的使用体验。此次发布的Neo10系列共有两款…

172页PPT集团数字化转型采购供应链及财务管控业务流程指南

一、供应商管理与数字化转型 1.1供应商管理数字化的重要性与挑战 重要性: 效率提升: 数字化可以提高供应商管理的效率,通过自动化流程减少手动操作,加快决策速度。透明度增强: 数字化工具可以提供实时数据&#xff…

springboot338it职业生涯规划系统--论文pf(论文+源码)_kaic

毕 业 设 计(论 文) 题目:it职业生涯规划系统的设计与实现 摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以…

【深度学习基础】一篇入门模型评估指标(分类篇)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀深度学习_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. 模…

【STM32学习】TB6612FNG驱动芯片的学习,驱动电路的学习

目录 1、TB6612电机驱动芯片 1.1如下是芯片的引脚图: 1.2如下图是电机的控制逻辑: 1.3MOS管运转逻辑 1.3典型应用电路 2、H桥驱动电路 2.1、单极模式 2.2、双极模式 2.3、高低端MOS管导通条件 2.4、H桥电路设计 2.5、自举电路 3、电气特性 3…

STM32 HAL库开发学习3.STM32启动浅析

STM32 HAL库开发学习3.STM32启动浅析 一、STM32启动模式(也称自举模式)1. MSP与PC指针赋值2. F1系列的启动模式:3. F4系列启动模式4. F7系列启动模式5. H7系列启动模式 二、STM32启动过程1. MSP 栈顶地址2. PC值3. Reset_Handler4. 启动文件内…

FCBP 认证考试要点摘要

理论知识 数据处理与分析:包括数据的收集、清洗、转换、存储等基础操作,以及数据分析方法,如描述性统计分析、相关性分析、数据挖掘算法等的理解和应用 。数据可视化:涉及图表类型的选择与应用,如柱状图、折线图、饼图…

xv6前置知识

fork函数 一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fork()函数后,系统先给新的进程分…

ECharts柱状图-极坐标系下的堆叠柱状图,附视频讲解与代码下载

引言: 在数据可视化的世界里,ECharts凭借其丰富的图表类型和强大的配置能力,成为了众多开发者的首选。今天,我将带大家一起实现一个柱状图图表,通过该图表我们可以直观地展示和分析数据。此外,我还将提供…

监控视频汇聚平台:Liveweb视频监控管理平台方案详细介绍

Liveweb国标视频综合管理平台是一款以视频为核心的智慧物联应用平台。它基于分布式、负载均衡等流媒体技术进行开发,提供广泛兼容、安全可靠、开放共享的视频综合服务。该平台具备多种功能,包括视频直播、录像、回放、检索、云存储、告警上报、语音对讲、…

MySQL源码编译

华子目录 下载源码包上传并解压安装cmake环境检测make编译make install安装 部署复制编译文件到别的主机上 下载源码包 下载相应源码包mysql5.7编译安装需要boost库,这里官网下载含boost的源码包https://downloads.mysql.com/archives/community/ 上传并解压 [roo…

请求(request)

目录 前言 request概述 request的使用 获取前端传递的数据 实例 请求转发 特点 语法 实例 实例1 实例2 【关联实例1】 域对象 组成 作用范围: 生命周期: 使用场景: 使用步骤 存储数据对象 获得数据对象 移除域中的键值…

推荐学习笔记:矩阵补充和矩阵分解

参考: 召回 fun-rec/docs/ch02/ch2.1/ch2.1.1/mf.md at master datawhalechina/fun-rec GitHub 业务 隐语义模型与矩阵分解 协同过滤算法的特点: 协同过滤算法的特点就是完全没有利用到物品本身或者是用户自身的属性, 仅仅利用了用户与…

构造函数与析构函数错题汇总

构造函数不能定义返回类型,也没有返回类型。 堆、栈、静态存储区。栈上的对象main函数结束就释放,堆上的需要手动释放,静态存储区的在所在作用域的程序结束时释放。这里static在main函数内,是局部变量,所以作用域为…

[免费]SpringBoot+Vue景区订票(购票)系统【论文+源码+SQL脚本】

大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue大景区订票(购票)系统,分享下哈。 项目视频演示 【免费】SpringBootVue景区订票(购票)系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 现代经济快节奏发展以及不断完善升级的信息…

fastdds:编译、安装并运行helloworld

fastdds安装可以参考官方文档: 3. Linux installation from sources — Fast DDS 3.1.0 documentation 从INSTALLATION MANUAL这一节可以看出来,fastdds支持的操作系统包括linux、windows、qnx、MAC OS。本文记录通过源码和cmake的方式来安装fastdds的…

HTTP 探秘之旅:从入门到未来

文章目录 导言:目录:第一篇:HTTP,互联网的“快递员”第二篇:从点开网页到看到内容,HTTP 究竟做了什么?第三篇:HTTP 的烦恼与进化史第四篇:HTTP 的铠甲——HTTPS 的故事第…