SpringCloud Alibaba - 分布式事务理论(CAP 定理 和 BASE 理论)

news2024/11/24 11:53:40

目录

一、分布式事务理论

1.1、分布式事务问题

1.2、什么是分布式事务

1.3、解决分布式事务思路

1.3.1、CAP 定理

a)Consistency(一致性)

b)Availability(可用性)

c)Partition tolerance (分区容错性)

问题1:为什么三者最多只能满足其二?

分析总结

问题2:ElasticSearch 的集群是属于哪种模式呢?

1.3.2、BASE 理论

a)基于 base 理论,通过 ap 模式解决

b)基于 basse 理论,通过 cp 模式解决

分析:上述方法的共同特点


一、分布式事务理论


1.1、分布式事务问题

在我们以往学习的单体架构中,往往只有一个服务,直接访问一个数据库,业务比较简单,已经能够实现 ACID 了(原子性、一致性、隔离性、持久性),但是微服务的业务往往比较复杂,可能一个业务就要跨多个服务,每个服务又有自己的数据库,这个时候在靠数据库本身的特性,可以就不一定能保证整个业务的 ACID 了.

例如,我这里有三个微服务,分别是订单服务、账户服务、库存服务.  现在有一个用户下单的业务,就是说用户下单的时候,希望订单服务去创建订单,然后再调用账户服务去扣 减用户余额,最后再调用库存服务去扣 减商品库存数量. 

可以看到整个业务中,每个微服务都有自己独立的数据库,独立的事务,那么我肯定希望的是,下单业务一旦执行,要么都成功,要么都失败. 

实际上,如果 订单服务 和 账户服务 执行成功,但是库存服务执行失败,那么是不会回滚. 为什么呢?

  1. 首先因为每一个服务都是独立的,并且是依次同步执行的,即使最后一个库存服务抛了一个异常,但是订单服务和账户服务都感知不到啊. 
  2. 每个服务的是独立的,那么他们的事务也都是独立的,也就意味着,执行完 订单服务 和 账户服务,他们的事务也就执行完成了,所以也没办法进行回滚,最终就没有达成事务一致的状态.

1.2、什么是分布式事务

在分布式系统下的一个业务,跨越了多个服务和数据库,每个防毒物都可以任务是一个分支事务,分布式事务就是要保证,所有分支事务最终状态一致,要么大家都成功,要么大家都失败.

而分布在事务出现了问题,就是因为各个分之事务之间是相互隔离,感知不到的,因此就导致无法回滚,进一步导致没法保证一致性.

1.3、解决分布式事务思路

1.3.1、CAP 定理

CAP 定理提出:分布式系统中有三个指标

  1. Consistency(一致性)
  2. Availability(可用性)
  3. Partition tolerance (分区容错性)

并且指出这个三个指标是不能同时满足的,最多只能满足其中两个.

为什么呢?我们就要弄清楚这三个指标的含义是什么.

a)Consistency(一致性)

一致性就是说,用户在访问分布式系统中的任意节点时,得到的数据必须时一致的.

比方说,我现在有两个节点,第一个节点上有一个数据 k1 的值为 0,第二个节点上也是一样,形成了一个主从关系.  现在我对第一个节点的数据进行修改,那么为了满足一致性,就需要将第一个节点的数据同步给第二个节点.  因此在分布式系统中,对数据进行修改时,一定要及时去完成数据同步.

b)Availability(可用性)

可用性就是说,用户在访问集群中的任意一个健康节点的时候,必须得到响应,不能是拒绝或者超时.

比如我这里有一个集群,包含三个节点,正常情况下用户访问任何一个节点都是没有问题的,但是突然有一天,请求发往其中一个节点被阻塞或者拒绝了,那么就说明这个节点不可用了,也就不能被正常访问了.

c)Partition tolerance (分区容错性)

先来看一下 “分区”,就是指因为网络的故障或者其他原因,导致分布式系统中的部分节点失去了连接,形成独立分区. 

比如说,我有 node1、node2、node3 三个节点,node1 和 node2 可以互相访问,node2 和 node3 可以相互访问,但是其中 node3 因为网络原因和 node2 断开了连接,就导致 node3 无法和 前两个节点进行数据同步,也就是说形成了两个分区,node1 和 node2 是一个分区, node3 是一个分区.  此时,如果有用户给 node1 上写数据,那么数据就会同步给 node2,但是 node3 确感知不到,就导致两个分区数据不一致了.

“分区容错” 就是指不管集群有没有出现分区,整个系统也都要持续对外提供服务,尽管你这里分区了,用户也是要继续访问的.

问题1:为什么三者最多只能满足其二?

AP (可用性、分区容错性):刚刚讲到分区容错,即使出现分区,用户也要继续访问,那么就会导致数据出现不一致的情况.

CP(一致性、分许容错性):那如果我就要满足一致性,怎么办?那我是不是可以等待 node3 (因为网络故障被分区的节点)这个节点和 node2 的网络恢复之前,阻塞所有请求,告诉他们 “你们等等,我这里数据还没有同步好呢!”,那是不是就可以满足数据的一致性了,但是明明三个健康的节点却不让用户访问,不就不满足可用性了嘛.

 CA(一致性、可用性):那如果我要满足可用性,又要保证一致性,那就需要保证数据的一致,那么就不允许出现分区的情况. 

分析总结

但是分区这种情况又是不可以避免的,因为在分布式系统中,节点之间虽然不一定是通过网络连接,但是你只要是通过网络连接,就没办法保证网络百分之百是健康的.  那么既然分区一定会出现,此时,就需要你在 a(可用性)和 c(一致性)之间做出选择了.

问题2:ElasticSearch 的集群是属于哪种模式呢?

当出现网络故障时,有节点与其他节点断开连接的时候,es 集群会处于一个警告状态,出现故障的节点过了一段时间就会从集群中剔除,而这个节点上的数据分片就会分散到其他健康的节点上去.  那么出现故障的节点就无法访问他了,也就是牺牲了可用性,因此 es 显然是一个 CP 啊.

1.3.2、BASE 理论

我们知道,在分布式系统下,分区时不可避免的,因此你不得不在 一致性 和 可用性 之间做出一个选择,但是这两个特性都非常重啊,一个都不想放弃怎么办?BASE 理论刚好可以解决这个问题.

BASE 理论中包含三个思想:

  1. Basically Available (基本可用):分布式系统在出现故障时,允许损失部分可用性,即保证核心可用。
  2. Soft State(软状态):在一定时间内,允许出现中间状态,比如临时的不一致状态。
  3. Eventually Consistent(最终一致性):虽然无法保证强一致性,但是在软状态结束后,最终达到数据一致。

实际上,BASE 理论就是对 可用性和一致性去做的调和和选择.  出现故障,我可以牺牲一部分的可用性,或者临时不可用,那么也就会导致这个期间会有部分数据不一致的情况,而一旦网络恢复了,在把他加入到集群中,重新给他分片,是不是又可用了,并且得到了最终的一致性.

那么基于 base 理论如何解决分布式事务呢?

a)基于 base 理论,通过 ap 模式解决

也就是满足可用性,牺牲一定的一致性.

比如说有很多子事务,将来分别去执行和提交,有些成功有些失败,产生不一致,也就是处于一个软状态了,当执行完了以后,在相互通个气问问 “欸?你成功了吗?哦,我成功了.  哎呀,我这边失败了......”.

一对比发现有人失败了,并且他还给提交了,没关系啊,我们也可以反向操作.  比如说你之前新增了一个,那接下来把他删了不就可以了,不也实现最终一致了.

因此,这是一种基于 ap 思想的分布式事务解决方案.

b)基于 basse 理论,通过 cp 模式解决

就是满足一致性,牺牲一定的可用性.

比如现在有很多子事务,一个个执行完之后别提交,互相等待,彼此都看看执行完了没. 如果全部执行完没问题,就同时提交. 如果中间有人失败了,就同时回滚. 

那么在这个过程中,各个子事务要相互等待,因此服务其实时处于一个弱可用状态,因为你会锁定资源啊,导致无法访问.

分析:上述方法的共同特点

各个子事务都需要做相互通信,辨别对方的执行状态,因此就需要有一个事务的协调者来帮助分布式事务中的各个子事务进行一个通信,感知彼此的状态.

比如拿之前的下单为例子,用户下单,调用订单服务,然后去调用账户和库存服务,此时就需要有一个事务协调者了. 

如果你现在要做强一致,那么在订单服务执行的时候不要提交,先把自己执行的状态告诉事务协调者(成功或者失败),接着执行账户服务 和 库存服务,然后把自己的状态都告诉事务协调者,如果发现有人失败了,再通知他们去做回滚,这样大家保持一致了.

这整个过程中,每一个子事务也叫做分支事务,而有关联的整个分支事务一起也称之为全局事务.

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

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

相关文章

反向生成:根据mybatis生成的Class实体类对象反向生成建表语句

微信公众号:大数据高性能计算 针对数据库不小心被删除的情况,以及需要逆向查看某个开源项目数据库表的情况时,往往需要逆向工程。 在这里我们假设 id 字段为主键。在生成 SQL 建表语句时,我们添加了 PRIMARY KEY (id) 来定义 i…

温控仪工作原理

温控仪的工作原理,是通过温度探头或热电偶反馈的电信号,温控仪将得到的电信号转化成温度值,根据设定的温度值,控制加热器的接通和断开来达到控制温度范围的: 1、温度探头或热电偶受温度变化时,会产生微弱的…

CDN技术与企业网站建设:解决疑问与明智选择

介绍CDN技术与疑问 在数字时代,网站是企业线上存在的门户,因此网站的性能和安全至关重要。为了解决一些与网站建设和性能相关的疑问,让我们首先来了解CDN技术。 什么是CDN技术? CDN,即内容分发网络(Conte…

Langchain-Chatchat项目:1.2-Baichuan2项目整体介绍

由百川智能推出的新一代开源大语言模型,采用2.6万亿Tokens的高质量语料训练,在多个权威的中文、英文和多语言的通用、领域benchmark上取得同尺寸最佳的效果,发布包含有7B、13B的Base和经过PPO训练的Chat版本,并提供了Chat版本的4b…

【重拾C语言】六、批量数据组织(四)线性表—栈和队列

目录 前言 六、批量数据组织——数组 6.1~3 数组基础知识 6.4 线性表——分类与检索 6.5~7 数组初值;字符串、字符数组、字符串数组;类型定义 typedef 6.8 线性表—栈和队列 6.8.1 栈(Stack) 全局变量 isEmpty() isFull…

TCP原理特性详解

文章目录 可靠传输机制1.确认应答2.超时重传2.连接管理1.三次握手2.四次挥手 传输效率1.滑动窗口2.流量控制3.拥塞控制4.延时应答5.捎带应答 面向字节流粘包问题 TCP异常情况 可靠传输机制 可靠性:即发送方知道数据是发送成功了,还是失败了。 1.确认应答…

Github-使用2FA验证:使用python实现TOTP验证,python实现github的2FA验证

github新增了2FA验证了, 1、扫描二维码,获取对应字符串 或点击setup key ,获取字符串 2、使用python来生成校验码 安装: pip install pytop import pyotp key XKDRR4WH3LY2WXPH print(pyotp.TOTP(key).now()) 3、将生成的6个验证码&…

第一章 概述 | 计算机网络(谢希仁 第八版)

文章目录 第一章 概述重要内容计算机网络的一些相关知识互联网概述因特网的标准化工作互联网的组成计算机网络的类别计算机网络的性能指标计算机网络的体系结构——-分层次的体系结构 第一章 概述 重要内容 互联网边缘部分和核心部分的作用,以及分组交换的概念 计…

学习记忆——宫殿篇——记忆宫殿——记忆桩——身体——记忆星座

我们在与人攀谈的时候,可以从以下几个维度入手,如:年龄、星座、爱好、工作等。 两点记忆的技巧以及一点知识延伸 两点记忆技巧: 1、第一次见面时要创建回忆线索 2、脑中回忆交流画面,加深线索 一点知识延伸&#xff1…

NoSQL之Redis 主从复制配置详解及哨兵模式

目录 1 Redis 主从复制 1.1 主从复制的作用 1.2 主从复制流程 2 搭建Redis 主从复制 2.1 安装 Redis 2.2 修改 Redis 配置文件(Master节点操作) 2.3 修改 Redis 配置文件(Slave节点操作) 2.4 验证主从效果 3 Redis 哨兵模…

自动拟人对话机器人在客户服务方面起了什么作用?

在当今数字时代,企业不断寻求创新的方法来提升客户服务体验。随着科技的不断进步和消费者期望的提升,传统的客户服务方式逐渐无法满足现代消费者的需求。因此,许多企业正在积极探索利用新兴技术来改进客户服务,自动拟人对话机器人…

javaScript关于闭包的理解

首先在了解闭包之前,我们要了解一下环境和作用域 1.环境和作用域 日常生活中我们生活的环境由周边建设如公园,小区,超市构成的。这就构成了环境 在计算机当中环境就是一块内存的数据。 环境是有作用范围的,eg:武汉周边的建设一…

YOLOv8 Tensorrt部署详细介绍(小白从0到1,不会你砍我)

下载YOLOv8项目和Tensorrt部署项目 git clone https://github.com/xiaocao-tian/yolov8_tensorrt.git git clone https://github.com/ultralytics/ultralytics.git 下载yolov8s模型 在YOLOv8项目中新建weights文件夹,将yolov8s.pt放入 运行tensorrt项目中gen_wts…

RabbitMQ 介绍与 SpringBootAMQP使用

一、MQ概述 异步通信的优点: 耦合度低吞吐量提升故障隔离流量削峰 异步通信的缺点: 依赖于Broker的可靠性、安全性、吞吐能力架构复杂,业务么有明显的流程线,不方便追踪管理 什么是的MQ MQ(Message Queue&#xf…

选择适合建筑公司的企业网盘平台

随着城市化进程的加速,越来越多的人开始关注乡村生活品质。Z公司以其标准化产品和优质资源整合,为回乡建房人群提供了一种全新的、高品质的整体解决方案。 Z公司深入调研了10W的回乡建房人群需求,组建了设计、工艺、供应链方面的专家团队&…

KUKA机器人通过直接输入法设定负载数据和附加负载数据的具体操作

KUKA机器人通过直接输入法设定负载数据和附加负载数据的具体操作 设置背景色: 工具负载数据 工具负载的定义: 工具负载数据是指所有装在机器人法兰上的负载。它是另外装在机器人上并由机器人一起移动的质量。需要输入的值有质量、重心位置、质量转动惯量以及所属的主惯性轴。…

边坡安全监测系统:守护边坡稳定的重要工具

在工程建设中,边坡安全监测系统一直被认为是掌握边坡安全及其支护结构维护决策系统的关键支撑条件。这一系统的主要目的在于确定边坡结构的稳定性,监控支护结构的承载能力、运营状态和耐久性能,并对边坡稳定性进行实时监控。 一、边坡安全监测…

CTF学习笔记——PWN(入门)

文章目录 [toc] CTF学习笔记——PWN(入门)PWN基础概念NC题[HGAME 2023 week1]test_nc 栈溢出[HNCTF 2022 Week1]easyoverflow 伪随机数[SWPUCTF 2022 新生赛]Darling 待补充待补充 CTF学习笔记——PWN(入门) 🚀&#x…

python常用库之数据库orm框架之SQLAlchemy

文章目录 python常用库之数据库orm框架之SQLAlchemy一、什么是SQLAlchemySQLAlchemy 使用场景 二、SQLAlchemy使用SQLAlchemy根据模型查询SQLAlchemy SQL 格式化的方式db_session.query和 db_session.execute区别实测demo 总结:让我们留意一下SQLAlchemy 的 lazy lo…

电流,功率监控芯片INA226应用(基于STM32工程)

一芯片介绍 INA226是具有I2C™或SMBUS兼容接口的电流分流器和功率监控器。该设备同时监视并联电压降和总线电源电压。可编程的校准值,转换时间和平均值与内部乘法器结合使用,可以直接读取以安培为单位的电流和以瓦特为单位的功率。INA226感应共模总线电…