【分布式事务】CAP定理和Base理论

news2024/11/26 4:54:46

文章目录

  • 1、事务的ACID原则
  • 2、分布式服务案例
  • 3、CAP定理
  • 4、Base理论
  • 5、分布式事务模型

1、事务的ACID原则

所有的事务都要满足ACID原则,在单体架构中,只有一个服务,这个服务访问一个数据库,场景简单。基于数据库本身的特性,就已经可以实现ACID。

在这里插入图片描述

但微服务下,一个业务可能跨越多个微服务,而每个服务又会有自己的数据库,这个时候,仅靠数据库自身,已经不能保证业务上的ACID了。

2、分布式服务案例

微服务下单,下单时调用订单服务,创建订单并写入数据库。然后订单服务还要调用账户服务和库存服务(三个微服务有各自的数据库):

  • 账户服务负责扣减用户余额
  • 库存服务负责扣减商品库存

在这里插入图片描述

对应上面的场景,创建一个demo工程,包含三个模块:

在这里插入图片描述
测试下单功能:

POST 'http://localhost:8082/order?userId=user202103032042012&commodityCode=100202003032041&count=2&money=200'

发现当库存数量不足扣减时,订单和账户却都更新成功了。

在这里插入图片描述

在分布式系统下,一个业务跨越多个服务或数据源,每个服务都是一个分支事务,而这些分支事务之间互相无感知,要保证所有分支事务最终状态一致,这样的事务就是分布式事务。

3、CAP定理

分布式系统有三个指标:

  • Consistency(一致性)
  • Availability(可用性)
  • Partition tolerance (分区容错性)

1998年,加州大学的计算机科学家 Eric Brewer 提出,分布式系统无法同时满足这三个指标,即CAP定理。

在这里插入图片描述

Consistency(一致性):用户访问分布式系统中的任意节点,得到的数据必须一致

在这里插入图片描述

即用户访问节点01和节点02得到的数据要一致。但问题是,用户将数据写如node01,01同步给02总是需要一个过程和时间的。

Availability (可用性):用户访问集群中的任意健康节点,必须能得到响应,而不是超时或拒绝

在这里插入图片描述

Partition(分区):因为网络故障或其它原因导致分布式系统中的部分节点与其它节点失去连接,形成独立分区。
Tolerance(容错):在集群出现分区时,整个系统也要持续对外提供服务

如下图,网络故障,使得node02和node03之间无法通信,此时用户将数据data:v1写入node02:
在这里插入图片描述

此时就出现了悖论,网络故障期间,如果所有节点仍然对外提供服务,则可用性A成立,但数据不一致了,即C不成立。如果节点node03暂时不提供服务,此时返回的01和02节点返回的数据当然是一致的,即C成立,但可用性A不成立。

网络故障不可避免,因此分区容错P一定要实现,此时分布式系统需要在C和A之间抉择。要CP还是AP。

总结就是:

- 分布式系统节点通过网络连接,一定会出现分区问题(P)
- 当分区出现时,系统的一致性(C)和可用性(A)就无法同时满足
- CP、AP选其一

ElasticSearch集群,就属于CP:

ES集群出现分区时,故障节点会被剔除出集群,其上的数据分片会重新分配到其它节点,保证数据一致。因此是低可用性,高一致性,属于CP

4、Base理论

CAP中,不管是CP还是AP,单独保证一方,而完全丢掉另一方,总是差点意思,因此Base理论出现。BASE理论是对CAP的一种解决思路,是对C和A的一种居中调和。Base理论主要有三个思想:

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

某ES节点挂了,就先踢出集群,其上的数据数据分片分配到其他节点。等这个节点恢复,又重新加到集群中,重新给它分片,这个节点又可用了。

而最后的软状态和最终一致性,则是另一种调和:

即我完全保证可用性,但一致性C我也不是完全抛弃,它只是这一小会儿不一致,最终我会同步成一致的。

5、分布式事务模型

分布式事务最大的问题是各个子事务的一致性问题,借鉴CAP定理和BASE理论就有了:

AP模式:各子事务分别执行和提交,允许出现结果不一致,然后采用弥补措施恢复数据即可,实现最终一致

CP模式:各个子事务执行后互相等待,同时提交,同时回滚,达成强一致。但事务等待过程中,处于弱可用状态。

在这里插入图片描述

不管CP还是AP,各个子事务之间都需要做一个通信,去辨别对方是否执行成功。而想实现各个子事务之间通信,需要一个事务协调者,分支事务需要将自己的执行结果告诉事务协调者。

在这里插入图片描述

解决分布式事务,各个子系统之间必须能感知到彼此的事务状态,才能保证状态一致,因此需要一个事务协调者来协调每一个事务的参与者(子系统事务)。这里的子系统事务,称为分支事务;有关联的各个分支事务在一起称为全局事务

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

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

相关文章

React 组件使用

React 组件是一个 js 函数,函数可以添加 jsx 标记 当前页使用组件,基本使用 注意:组件的名称,第一个字母一定要大写,否则会报错 import { createRoot } from "react-dom/client"; import "./index.c…

深度学习(30)—— DeformableDETR(1)

深度学习(30)—— DeformableDETR(1) 原本想在一篇文章中就把理论和debug的过程都呈现,但是发现内容很多,所以就分开两篇,照常先记录理论学习过程,然后是实践过程。 注:…

Flutter学习—— Vscode创建项目

目录 一、Vscode创建项目 二、补充五种项目类型 Application: Module 模块开发, Package开发 Plugin 插件开发 Skeleton 骨架开发 一、Vscode创建项目 1.快捷键 CtrlShiftP 打开命令面板,选择新项目 2.选择需要开发的项目类型 Application 应用开…

勾股dev部署

1.克隆项目 项目的地址: https://gitee.com/gouguopen/dev?_fromgitee_search#-%E5%BC%80%E6%BA%90%E5%8A%A9%E5%8A%9B 可以采用git clone https://gitee.com/gouguopen/dev.git 或者使用下载压缩包的形式 2.进入项目的根目录 cd gougudev 3.下载php依赖 需要…

三种策略改进的沙猫群优化算法(MSCSO),与白鲸、蜣螂、麻雀等多种算法进行比较,MATLAB代码...

沙猫群优化算法(sand cat swarm optimiza⁃ tion,SCSO)是 2022年提出的元启发式优化算法,该算法灵感来源于沙猫的捕食行为,沙猫群会通过搜索阶段和捕食阶段获得食物。其中算法额外使用自适应的rG和R以达到搜索阶段和捕食阶段的无缝 切换。该算法具有寻优…

刷题日记09《图论基础》

图的存储结构 对于图结构而言,常见的存储结构主要有两种:邻接表和邻接矩阵: 邻接表很直观,我把每个节点 x 的邻居都存到一个列表里,然后把 x 和这个列表关联起来,这样就可以通过一个节点 x 找到它的所有相邻…

java 8树结构返回前端

接口&#xff1a; EntityResult getOrgReal(Map<String, Object> mapParam); 实现类&#xff1a; PMethodHandle(runMethodName "TQmsZjxmzbImpl.getOrgReal", timeout 600) Override public EntityResult getOrgReal(Map<String, Object> mapParam…

vs2015 工程组织与动态加载

10.Visual Studio动态加载_哔哩哔哩_bilibili 1.工程组织 ① researcher.cpp #include "nn/nn.h"#include "nn/factory.h" #include "nn/factory_impl/factory_impl.h"#include <iostream>int main() {int ret 0;factory_i* fct new f…

Invalid bound statement (not found),springboot扫描不到jar包中mapper文件的问题处理

参考这位大佬的博客&#xff1a;Invalid bound statement (not found)&#xff0c;springboot扫描不到jar包中mapper文件的问题处理_springboot扫描不到mapper_Jamesharden13的博客-CSDN博客 classpath:和classpath*:的区别_classpath和classpath*区别_明快de玄米61的博客-CSD…

JavaWeb课程设计项目实战(06)——项目编码实践3

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 在本教程教程中&#xff0c;我们实现学生列表的显示。 Student 请在bean包下创建Student类&#xff0c;代码如下&#xff1a; package com.cn.bean; /*** 本文作者&#…

MIMIC数据库申请流程

MIMIC是一个公开的临床数据库&#xff0c;之前查找了很多资料&#xff0c;在这里记录一下整个申请流程。 一、CITI证书 要申请mimic数据库的使用权限&#xff0c;首先需要有CITI证书&#xff0c;这是一个国际知名的网络训练课程&#xff0c;其中就有用于健康资讯隐私及保护 (…

Spring 用了哪些设计模式

关于设计模式&#xff0c;如果使用得当&#xff0c;将会使我们的代码更加简洁&#xff0c;并且更具扩展性。本文主要讲解Spring中如何使用策略模式&#xff0c;工厂方法模式以及Builder模式。 策略模式 关于策略模式的使用方式&#xff0c;在Spring中其实比较简单&#xff0c…

408-2009

一、选择题&#xff08;2 分/题&#xff09; 1.为解决计算机主机与打印机之间速度不匹配问题&#xff0c;通常设置一个打印数据缓冲区&#xff0c;主机将要输出的数据一次写入该缓冲取&#xff0c;而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是______。 A.栈 …

iOS--编译连接的过程_2

文章目录 iOS编译&#xff08;一&#xff09;编译器前端 编译器后端执行一次XCode build的流程 IPA包的内容二进制文件的内容iOS Link Map File文件说明1. Link Map File 是什么2. Link Map File 有什么用3. 生成 Link Map File查看Link Map File1&#xff09;路径部分计算机系…

Linux进程间通信(fifo有名管道)

文章目录 前言一、有名管道概念讲解二、命令行创建fifo三、非命令行创建fifo四、fifo和管道对比总结 前言 上篇文章我们讲解了无名管道&#xff0c;这篇文章我们就来讲解一下有名管道。 一、有名管道概念讲解 有名管道(fifo) 有名管道&#xff08;FIFO&#xff09;是一种命…

jmeter请求重试实现思路

文章目录 一、背景二、尝试的解决方案三、最终解决方案&#xff1a;jmeter retrier插件&#xff01; 一、背景 最近系统需要压测一些活动&#xff0c;场景是新建抽奖活动之后&#xff0c;每隔2s查询1次&#xff08;最多3次&#xff0c;3次后还是失败就算失败&#xff09;&…

linux学成之路(基础篇)(二十)rsync服务器

目录 前言 一、概述 监听端口 二、特点 快捷 安全 三、数据的同步方式 四、rsync传输方式 本地传输 远程传输 守护进程 五、命令 作为远程命令 作为rsync服务 选项 六、配置文件 全局配置 模块配置 守护进程传输 七、rsyncinotfy实时同步 一、服务端 二、…

Qgis二次开发-QgsMapLayer(加载矢量、栅格图层)

1.简介 QgsMapLayer是所有地图层类型的基类&#xff0c;这是所有地图层类型(矢量&#xff0c;栅格)的基类&#xff0c;首先定义一个QgsMapCanvas地图画布&#xff0c;然后画布上添加图层&#xff0c;使用以下方法设置图层集合。 //设置当前图层集合 void setLayers (const QL…

算法提高-动态规划-单调队列优化DP

单调队列优化DP AcWing 135. 最大子序和AcWing 1087. 修剪草坪AcWing 1089. 烽火传递AcWing 1090. 绿色通道 关于单调队列的初始化 AcWing 135. 最大子序和 注意hh 0,tt -1 tt 0初始化的时候队列有什么不同&#xff0c;主要还是要理解队列的实际意义 #include <iostre…

利用python绘制二维向量图

为了实现地层数据的变化趋势的可视化模拟&#xff0c;最近研究了python环境下的可视化方案&#xff0c;为后续的流体运动的仿真模拟做好储备&#xff0c;主要采用matplotlib中的quiver函数&#xff0c;实现二维等值线数据的随深度或者地层数据的变化趋势绘制。 一、运行环境&a…