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

分布式理论:CAPBASE理论

1 CAP理论

1.1 简介

CAP也就是Consistency(一致性)、Availability(可用性)、Partition Tolenrance(分区容错性)这三个单词首字母组合。

在理论计算机科学中,CAP定理(CAP theorem)指出对于一个分布式系统来说,当涉及读写操作时,只能同时满足C、A、P三点中的两点:(而且一定是CP或者是AP,没有CA情况)

  • 一致性(C):所有节点访问同一份最新的数据副本
  • 可用性(A):非故障的节点在合理的时间内返回合理的响应(不是错误的或者超时的响应)。
  • 分区容错性(P):分布式系统出现网络分区的时候,仍然能够对外提供服务。

1.什么是网络分区?

分布式系统中,多个节点之间的网络本来是联通的,但是因为某些故障,例如部分节点出现了问题,节点之间不连通了,整个网络就分成了几块区域,这就叫网络分区。

2.CA为什么不行?

如果系统出现分区(不满足P),系统中的某个节点在进行写操作

CAP定理作为分布式系统设计的核心理论,其内涵远比常见的"三选二"表述更为深刻。我们有必要从理论演进和工程实践两个维度重新解读:

在分布式系统的设计哲学中,网络分区(Partition tolerance)并非可选项而是必选项。这是由分布式系统的基础特性决定的——任何依赖网络通信的系统都可能遭遇网络中断、节点故障等分区场景。2012年Eric Brewer在修正论文时特别强调,CAP定理的正确解读应当是:当发生网络分区(P)时,系统只能在强一致性(C)和可用性(A)之间二选其一,而非单纯的三者取二。

这种理论演进揭示了两个关键认知:

  1. CA架构的不可行性:假设系统永远不发生分区是工程上的致命谬误。以银行转账系统为例,若坚持CA设计,在网络中断时将导致整个系统瘫痪,这显然违背金融业务的连续性要求。实践中真正的选择存在于CP(如ZooKeeper)和AP(如Cassandra)架构之间。

  2. 动态权衡的工程智慧

  • CP系统通过牺牲部分可用性确保强一致性,如HBase在分区期间会拒绝写入请求,保证数据版本统一
  • AP系统则优先保证服务可用性,如Eureka服务注册中心在网络波动时允许临时数据不一致,但确保服务发现机制持续运转
  • 现代系统如Nacos创新性支持模式切换,体现了动态场景下的适应性设计

值得特别注意的是,CAP定理描述的是网络分区发生时的极端场景。在超过99%的正常运行时间里,优秀分布式系统(如etcd)通过Raft等共识算法,完全能够同时保证强一致性和高可用性。这种设计哲学启示我们:分布式架构的本质不是静态取舍,而是通过精妙机制(如异步复制、故障转移)来延缓或弱化CAP的约束。

最终架构选择取决于业务本质:证券交易系统必须选择CP来保证订单的确定性,社交媒体的点赞功能则更适合AP架构以保障用户体验。这种选择背后折射的是对数据价值层级的深度理解——有些数据错误是致命的,有些则可以在后续同步中修正。工程师的智慧,就在于在动态变化的网络环境中找到业务需求与技术约束的最优平衡点。

 1.2 CAP实际应用案例

CAP实际应用案例:电商系统设计中的动态权衡

​1.2.1 场景背景

某头部电商平台在"双11"大促期间面临以下业务需求:

  1. 订单系统:必须保证每个商品不会超卖(强一致性)
  2. 库存服务:需要承受每秒50万次查询(高可用性)
  3. 购物车系统:允许用户在不同设备间临时看到不一致数据(最终一致性)
1.2.2 技术实现与CAP选择

1. 订单系统(CP架构)​

  • 业务需求:避免同一商品被重复售卖,确保支付金额准确
  • 技术方案:采用分库分表的MySQL集群 + ZooKeeper分布式锁
  • CAP实践
    • 当某个数据库分片出现网络分区时,ZooKeeper立即触发熔断机制,停止受影响分片的写入操作(牺牲可用性A)
    • 未受影响的分片继续通过两阶段提交协议(2PC)保证跨库事务的强一致性(保持一致性C)
    • 客户端收到"系统繁忙"提示(HTTP 503),但保证已生成的订单绝对准确
  • 典型问题:2020年某次故障中,华东机房网络中断导致该区域30%用户10分钟无法下单,但避免了错误订单产生

2. 库存服务(AP架构)​

  • 业务需求:宁可显示"库存可能不准"也要保持服务可用
  • 技术方案:Redis集群 + 本地缓存 + 异步校对机制
  • CAP实践
    • 正常情况:通过Redis的RedLock算法保证库存扣减一致性(CP模式)
    • 网络分区时:
      • 前端显示"库存仅供参考"(保留可用性A)
      • 采用库存预扣机制,在Redis节点间异步同步数据(最终一致性)
      • 设置5%的冗余缓冲库存,通过定时任务修复极端情况下的超卖
  • 效果:2023年双11期间,库存服务在某个AZ(可用区)故障时仍保持99.99%可用性,事后统计超卖率仅0.003%

3. 购物车系统(动态CAP)​

  • 业务需求:优先保证用户添加商品体验,允许不同设备间短暂不一致
  • 技术方案:Cassandra数据库 + 客户端本地存储
  • CAP实践
    • 网络正常时:通过Cassandra的轻量级事务(Paxos协议)实现跨设备同步(CP模式)
    • 网络异常时:
      • 用户在本设备看到的购物车数据来自本地存储(保持可用性A)
      • 后台通过冲突自由数据类型(CRDT)自动合并数据变更
      • 设备重连后通过"时间戳+操作日志"解决冲突(最终一致性)
  • 用户体验:用户A在手机端删除商品时,PC端可能短暂显示该商品,但10秒内自动同步消失
​1.2.3 关键设计启示
  1. 分层CAP策略:同一系统的不同模块可采用不同CAP策略(如订单CP、库存AP)
  2. 降级机制:通过「客户端缓存+异步重试」将强一致性降级为最终一致性(如购物车)
  3. 监控驱动:基于网络分区发生概率动态调整策略(如平时用CP,分区时自动降级AP)
  4. 业务补偿:使用对账系统修复CAP选择带来的副作用(如凌晨2点修复库存偏差)
​1.2.4 现实中的复杂性
  • 网络分区的灰度影响:2022年某次云服务故障导致部分微服务通信中断,触发订单系统CP模式与库存系统AP模式的不兼容,最终通过「服务网格重试策略+流量染色」解决
  • 混合云的特殊场景:跨境业务中不同国家的法律要求(如欧盟GDPR)可能强制某些数据必须保持CP,形成CAP选择的法律约束

这个案例表明,CAP定理不是非黑即白的选择题,而是需要结合业务场景、故障概率、用户体验等多维度因素进行动态权衡的工程艺术。优秀的分布式系统设计,往往是在不同层级、不同时段对CAP进行精细化组合应用的结果。

1.3 总结 

        在分布式系统设计与开发过程中,设计者不应将视野局限在CAP理论的基础探讨上,同样需要重视系统的扩展性、高可用性等关键特性。

        根据CAP理论的核心约束,当系统遭遇网络分区(Partition Tolerance)时,必须在数据一致性(Consistency)和可用性(Availability)之间做出权衡选择,形成CP或AP两种架构模式。值得强调的是,该理论的适用前提是系统确实处于网络分区状态。当系统处于网络正常运行的无分区(Non-Partitioned)状态时,分区容忍性(P)的约束条件将自动解除,此时系统理论上能够兼顾数据一致性(C)和可用性(A)的双重保障。

        这种动态特征要求架构师采取分层设计策略:在分区场景下需根据业务特性决策CP/AP的优先级(如金融交易等强一致性场景应优先保障CP,而在互联网服务等高可用需求场景则更适合选择AP);在无分区常态下则需要通过副本同步、事务协调等机制持续优化CA指标,为系统构建灵活弹性的架构基础。

2 BASE理论

2.1 简介

        BASEBasically Available(基本可用)Soft-state(软状态)Eventually Consistent(最终一致性) 三个短语的缩写。BASE 理论是对 CAP 中一致性 C 和可用性 A 权衡的结果,其来源于对大规模互联网系统分布式实践的总结,是基于 CAP 定理逐步演化而来的,它大大降低了我们对系统的要求。

2.2 BASE理论的核心思想

即使无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来时系统达到最终一致性。

也就是牺牲数据的强一致性来满足系统的高可用性,系统中的一部分数据不可用或者不一致时,仍需要保持系统整体“主要可用”。

 BASE理论本质上是对CAP的延伸和补充,更具体的说,是对CAP中AP方案的一个补充。

如果系统没有发生“分区”的话,节点间的网络连接通信正常的话,也就不存在P了。这个时候,我们就可以同时保证C和A了。因此,如果系统发生“分区”,我们要考虑选择AP还是CP,如果没有,我们要思考如何保证CA。

因此 ,AP方案只是在系统发生分区的时候放弃一致性,而不是永远放弃一致性。在分区故障恢复后,系统应该达到最终一致性。这一点就是BASE理论延伸的地方。

2.2 基本可用

基本可用是指分布式系统在出现不可预知故障的时候,允许损失部分可用性。但是,这绝不等价于系统不可用。

什么叫允许损失部分可用性?

  • 响应时间上的损失:例如,正常情况下,处理用户请求需要0.5s返回结果,但是由于系统出现故障,处理用户请求时间变为3s。
  • 系统功能上的缺失:例如,在正常情况下,用户可以使用系统全部功能,但是系统访问量突然激增,系统的部分非核心功能无法使用

 2.3 软状态

软状态指允许系统中的数据存在中间状态(CAP理论中的数据不一致),并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程中存在延时

2.4 最终一致性

最终一致性强调的是系统中所有的副本,在经过一段时间的同步后,最终能够达到一个一致的状态。因此最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。

分布式一致性的 3 种级别:

  1. 强一致性:系统写入了什么,读出来的就是什么。
  2. 弱一致性:不一定可以读取到最新写入的值,也不保证多少时间之后读取到的数据是最新的,只是会尽量保证某个时刻达到数据一致的状态。
  3. 最终一致性:弱一致性的升级版,系统会保证在一定时间内达到数据一致的状态。

业界比较推崇是最终一致性级别,但是某些对数据一致要求十分严格的场景比如银行转账还是要保证强一致性。

那最终实现一致性具体方案?

  • 读时修复 : 在读取数据时,检测数据的不一致,进行修复。比如 Cassandra 的 Read Repair 实现,具体来说,在向 Cassandra 系统查询数据的时候,如果检测到不同节点的副本数据不一致,系统就自动修复数据。
  • 写时修复 : 在写入数据,检测数据的不一致时,进行修复。比如 Cassandra 的 Hinted Handoff 实现。具体来说,Cassandra 集群的节点之间远程写数据的时候,如果写失败 就将数据缓存下来,然后定时重传,修复数据的不一致性。
  • 异步修复 : 这个是最常用的方式,通过定时对账检测副本数据的一致性,并修复。

比较推荐 写时修复,这种方式对性能消耗比较低。

3 总结

ACID 是数据库事务完整性的理论,CAP 是分布式系统设计理论,BASE 是 CAP 理论中 AP 方案的延伸。

相关文章:

分布式理论:CAPBASE理论

1 CAP理论 1.1 简介 CAP也就是Consistency(一致性)、Availability(可用性)、Partition Tolenrance(分区容错性)这三个单词首字母组合。 在理论计算机科学中,CAP定理(CAP theorem&…...

大数据学习(86)-Zookeeper去中心化调度

🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…...

uniapp再次封装uni-nav-bar导航栏组件

<!-- components/custom-nav-bar/custom-nav-bar.vue --> <template><view class"custom-nav" :style"{ backgroundColor: bgColor }"><!-- 状态栏占位 --><view class"status-bar" :style"{ height: statusBar…...

ngx_http_index_t

定义在 src\http\modules\ngx_http_index_module.c typedef struct {ngx_str_t name;ngx_array_t *lengths;ngx_array_t *values; } ngx_http_index_t; 该结构体用于 存储和解析 index 指令中单个索引文件的信息 &#xff0c;支持静态…...

深入解析Flink Kafka Connector的分布式流数据采集架构与底层实现

目录 1. Flink Kafka连接器的分布式流采集架构 1.1 架构组成 1.2 分布式流模型 2. 数据分区分配策略 3. 为什么重写序列化和偏移量管理 3.1 与Flink分布式架构集成 3.2 与Flink检查点机制集成同时承接多级并行架构 3.3 OffsetsInitializer与细粒度偏移量控制 3.4 与Fl…...

vcd波形转仿真激励

我们使用vivado的ila抓取波形后&#xff0c;常常希望用该波形作为激励参与仿真。稍微复杂的项目中手动输入的工作量巨大&#xff0c;几乎是不可能采取的方式。我的方法是保存ila波形为vcd格式文件&#xff0c;用python解析vcd文件&#xff0c;转换成仿真激励的代码。 python代码…...

【STM32】知识点介绍二:GPIO引脚介绍

文章目录 一、概述二、GPIO的工作模式三、寄存器编程 一、概述 GPIO&#xff08;英语&#xff1a;General-purpose input/output&#xff09;,即通用I/O(输入/输出)端口&#xff0c;是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来&#xff0c;可实现与外部通讯、…...

【AI】NLP

不定期更新&#xff0c;建议关注收藏点赞。 目录 transformer大语言模型Google Gemma疫情网民情绪识别 整体框架 baseline构建 模型调参、模型优化、其他模型 数据trick、指标优化、magic feature 数据增强、伪标签、迁移学习 模型融合sklearn中TFIDF参数详解 频率阈值可以去掉…...

Go 代理爬虫

现在注册&#xff0c;还送15美金注册奖励金 --- 亮数据-网络IP代理及全网数据一站式服务商 使用代理服务器&#xff0c;通过 Colly、Goquery、Selenium 进行网络爬虫的基础示例程序 本仓库包含两个分支&#xff1a; basic 分支包含供 Go Proxy Servers 这篇文章改动的基础代码…...

【NLP 43、大模型技术发展】

目录 一、ELMo 2018 训练目标 二、GPT-1 2018 训练目标 三、BERT 2018 训练目标 四、Ernie —— baidu 2019 五、Ernie —— Tsinghua 2019 六、GPT-2 2019 七、UNILM 2019 八、Transformer - XL & XLNet 2019 1.模型结构 Ⅰ、循环机制 Recurrence Mechanism Ⅱ、相对位置…...

在普通用户下修改root用户密码

1 从普通用户切换到root用户 sudo -s 再输入密码。 2 输入passwd ,会提醒你输入当前用户密码&#xff0c;验证后会提醒你输入root用户密码。 3 切换到root用户&#xff0c;使用修改过的密码登陆。 4 成功进入root用户。...

【每日算法】Day 6-1:哈希表从入门到实战——高频算法题(C++实现)

摘要 &#xff1a;掌握高频数据结构&#xff01;今日深入解析哈希表的核心原理与设计实现&#xff0c;结合冲突解决策略与大厂高频真题&#xff0c;彻底掌握O(1)时间复杂度的数据访问技术。 一、哈希表核心思想 哈希表&#xff08;Hash Table&#xff09; 是一种基于键值对的…...

go命令使用

查看配置信息 go env配置go国内源 export GO111MODULEon export GOPROXYhttps://goproxy.cn测试 go install github.com/jesseduffield/lazydockerlatesthttps://github.com/jesseduffield/lazydocker...

深入 SVG:矢量图形、滤镜与动态交互开发指南

1.SVG 详细介绍 SVG&#xff08;Scalable Vector Graphics&#xff09; 是一种基于 XML 的矢量图形格式&#xff0c;用于描述二维图形。 1. 命名空间 (Namespace) 命名空间 URI&#xff1a;http://www.w3.org/2000/svg 用途&#xff1a;在 XML 或 XHTML 中区分不同标记语言的…...

SPPAS安装及问题汇总

SPPAS下载地址 文件找不到&#xff0c;可能是MAC的自动化操作问题&#xff0c;解决方案有二&#xff1a; 方案一&#xff1a; 直接查看SPPAS中的readme&#xff0c;运行sppas.command 方案二&#xff1a; 在自动化脚本中添加 export PATH/usr/local/bin:$PATH...

LINUX基础 [三] - 进程创建

目录 前言 进程创建的初次了解&#xff08;创建进程的原理&#xff09; 什么是fork函数&#xff1f; 初识fork函数 写时拷贝 fork函数存在的意义 fork调用失败的原因 进程终止 运行完毕结果不正确 main函数返回 库函数函数exit 系统调用接口_exit 进程异常终止 进…...

【day1】数据结构刷题 链表

一 反转链表 206. 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]…...

鼠标在客户区内按下左键和双击右键

书籍&#xff1a;《Visual C 2017从入门到精通》的2.6鼠标 环境&#xff1a;visual studio 2022 内容&#xff1a;【例2.44】鼠标在客户区内按下左键和双击右键 1.创建一个单文档程序 一个简单的单文档程序-CSDN博客https://blog.csdn.net/qq_20725221/article/details/1463…...

c++ map和vector模板类

在这一章中C语法之模板函数和模板类-CSDN博客 我们学习了怎样写模板函数和模板类&#xff0c;接下来我们来学习系统给我们写好的两个模板类:map和vector。 我相信有了上文的基础&#xff0c;能帮助我们更好的理解这些模板类。 map和vector 是C STL(标准模板库) 中的一部分&a…...

hn航空app hnairSign unidbg 整合Springboot

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 学习unidbg补环境。先弄一个…...

Arm Linux ceres库编译

由于工作需要&#xff0c;需在国产化系统上编译ceres库&#xff0c;手上有一块树莓派&#xff0c;就在树莓派上面进行测试编译ceres库&#xff0c;总体来说比较顺利。只出现了一点小问题 参考链接&#xff1a; Ceres中文教程-安装 Ceres官方网站&#xff08;英文&#xff09; …...

c++中的四种cast转换

文章目录 前言一、dynamic_cast二、static_cast三、const_cast四、reinterpret_cast总结 前言 C继承并扩展C语言的传统类型转换方式&#xff0c;提供了功能更加强大的转型机制&#xff08;检查与风险&#xff09; 转换类型典型用途安全性static_cast相关类型转换&#xff08;…...

矩阵补充,最近邻查找

矩阵补充&#xff0c;最近邻查找 矩阵补充是向量召回最简单的一种方法&#xff0c;现在不常用&#xff0c;学习矩阵补充是为了更好的理解后面学到的双塔模型 下图&#xff0c;输入用户ID和物品ID后从Eebedding层拿到对应的向量做内积&#xff0c;内积的结果就是矩阵补充 模型…...

gradio调用多个CSS的HTML页

很多博客介绍的gradio读取html和css比较简单&#xff0c;如果要做很细致的前端页面优化&#xff0c;比如丰富的响应式的cssjs&#xff0c;至少要有html多个css&#xff0c;是暂不能实现的。bootstrap、font-awesome、jquery等 方案一当然是直接更换htmlcss为主的部署方式&#…...

NVIDIA NeMo 全面教程:从入门到精通

NVIDIA NeMo 全面教程&#xff1a;从入门到精通 文章目录 NVIDIA NeMo 全面教程&#xff1a;从入门到精通目录框架介绍NeMo的核心特点NeMo的架构NeMo与其他框架的比较NeMo的模型集合NeMo的工作流程NeMo 2.0的新特性 安装指南系统要求使用Docker容器安装步骤1&#xff1a;安装Do…...

Go 语言封装邮件发送功能

Go 语言封装邮件发送功能 &#x1f3c6; 目标&#x1f4e6; 依赖包&#x1f31f; 项目结构&#x1f680; 代码实现&#x1f6e0;️ 主要方法说明&#x1f9ea; 单元测试&#x1f308; 使用示例&#x1f3c6; 代码亮点&#x1f31f; 改进方向&#x1f680; 总结 在现代 Web 开发…...

加新题了,MySQL 8.0 OCP 认证考试 题库更新

MySQL 8.0 OCP 认证考试 题库更新 MySQL 8.0 Database Administrator 考试科目&#xff1a;1Z0-908 近期发现&#xff0c;MySQL OCP认证考试题库发生变化&#xff0c;出现了很多新题&#xff0c;对此&#xff0c;CUUG专门收集整理了最新版本的MySQL考试原题&#xff0c;并会给…...

Thales靶机攻略

1.下载导入VBox&#xff0c;并启动靶机 靶机地址&#xff1a;https://download.vulnhub.com/thales/Thales.zip 解压后&#xff0c;在VBox中导入虚拟电脑。包含所有网卡的MAC地址。 导入完成&#xff0c;设置网卡模式为仅主机网络。开启靶机。 kali网卡更改为桥接模式。点击工…...

尝试使用Tauri2+Django+React项目(2)

前言 尝试使用tauri2DjangoReact的项目-CSDN博客https://blog.csdn.net/qq_63401240/article/details/146403103在前面笔者不知道怎么做&#xff0c;搞了半天 笔者看到官网&#xff0c;原来可以使用二进制文件&#xff0c;好好好 嵌入外部二进制文件 | Taurihttps://v2.taur…...

6.1 模拟专题:LeetCode 1576. 替换所有的问号

1. 题目链接 LeetCode 1576. 替换所有的问号 2. 题目描述 给定一个仅包含小写字母和问号 ? 的字符串 s&#xff0c;要求将所有 ? 替换为任意小写字母&#xff0c;使得替换后的字符串中 没有相邻的两个字符相同。 示例&#xff1a; 输入&#xff1a;s "?zs" →…...