当前位置: 首页 > 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&…...

自适应柔顺性策略:扩散引导控制中学习近似的柔顺

24年10月来自斯坦福大学和 TRI 的论文“Adaptive Compliance Policy: Learning Approximate Compliance for Diffusion Guided Control”。 柔顺性在操作中起着至关重要的作用,因为它可以在不确定的情况下平衡位置和力的并发控制。然而,当今的视觉运动策…...

python中所有内置类型

文章目录 数值类型序列类型集合类型映射类型布尔类型空类型代码汇总 在 Python 中,数据类型可分为内置数据类型和用户自定义数据类型。内置数据类型是 Python 解释器直接支持的类型 数值类型 整数(int):表示整数,可正…...

​「Java-API帮助文档」

「Java-API帮助文档」,链接:https://pan.quark.cn/s/d7ced3b48f33 java.applet提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。java.awt包含用于创建用户界面和绘制图形图像的所有类。java.awt.color提供用于颜色空间的类。java…...

1204. 【高精度练习】密码

文章目录 题目描述输入输出样例输入样例输出数据范围限制CAC代码 题目描述 人们在做一个破译密码游戏: 有两支密码棒分别是红色和蓝色,把红色密码棒上的数字减去蓝色 密码棒上的数字,就是开启密码锁的密码。 现已知密码棒上的数字位数不超过…...

SVN简明教程——下载安装使用

SVN教程目录 一、开发中的实际问题二、简介2.1 版本控制2.2 Subversion2.3 Subversion的优良特性2.4 工作原理2.5 SVN基本操作 三、Subversion的安装与配置1. 服务器端程序版本2. 下载源码包3. 下载二进制安装包4. 安装5. 配置版本库① 为什么要配置版本库?② 创建目…...

“智改数转”新风口,物联网如何重构制造业竞争力?

一、政策背景 为深化制造业智能化改造、数字化转型、网络化联接,江苏省制定了《江苏省深化制造业智能化改造数字化转型网络化联接三年行动计划(2025-2027年)》,提出到2027年,全省制造业企业设备更新、工艺…...

从数据洪流到智能洞察:人工智能如何解锁大数据的价值?

引言:数据洪流时代,企业的机遇与挑战 在这个信息爆炸的时代,数据正以前所未有的速度增长。IDC预测,全球数据量将在未来几年内持续飙升,企业每天都会产生海量的用户行为数据、市场交易数据、设备传感数据等。理论上&…...

蓝桥杯 之 数论

文章目录 习题质数找素数 LCM报数游戏 快速幂数字诗意 组合数与错位排序小蓝与钥匙 同余取模 数论,就是一些数学问题,蓝桥杯十分喜欢考察,常见的数论的问题有:取模,同余,大整数分解,素数&#x…...

SpringBoot的启动原理?

大家好,我是锋哥。今天分享关于【SpringBoot的启动原理?】面试题。希望对大家有帮助; SpringBoot的启动原理? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring Boot的启动原理主要是通过 SpringApplication 类来…...

从零开始搭建向量数据库:基于 Xinference 和 Milvus 的文本搜索实践

引言 在 AI 和大数据时代,向量数据库正成为处理非结构化数据(如文本、图像)的利器。最近,我尝试用 Xinference 和 Milvus 搭建一个简单的文本搜索系统,从读取本地文本文件到实现交互式查询和高亮显示匹配结果&#xf…...

音视频系列——Websockets接口封装为Http接口

模型服务示例:实时语音转文本服务 本示例展示一个支持双协议(WebSocket流式接口HTTP同步接口)的语音转文本模型服务,并提供将WebSocket接口封装为HTTP接口的代码实现。 一、服务架构设计 #mermaid-svg-nw0dMZ4uKfS4vGZR {font-fa…...

scrapy入门(深入)

Scrapy框架简介 Scrapy是:由Python语言开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据,只需要实现少量的代码,就能够快速的抓取。 新建项目 (scrapy startproject xxx):新建一个新的…...

docker模拟Dos_SYN Flood拒绝服务攻击 (Ubuntu20.04)

目录 ✅ 一、实验环境准备(3 个终端) 👉 所以最终推荐做法: 2️⃣ 配置 seed-attacker 为攻击者,开启 telnet 服务: 3️⃣ 配置 victim-10.9.0.5 为受害者服务器,开启 telnet 客户端并监听&…...

使用 Ansys Fluent 评估金属管道腐蚀

金属管道的维护和完整性在石油和天然气、石化和供水等各个行业中都至关重要。腐蚀对这些管道构成了重大威胁,可能导致泄漏、结构故障和环境危害。Ansys Fluent 提供了一个强大的平台来建模和分析金属管道腐蚀。 腐蚀是一种自然过程,金属材料会因与环境发…...

firefly经典蓝牙和QProcess、QFileSystemWatcher记录

QProcess 默认不会启动一个 shell 来解析命令,而是直接调用操作系统的系统调用来启动外部程序。也就是通过fork一个子线程或者exec一个子进程来执行命令。 QProcess的参数模式 QProcess 需要明确指定命令的可执行文件路径或参数列表。 如果命令是一个可执行文件的路径…...

基于PySide6的CATIA自动化工具开发实战——空几何体批量清理系统

一、功能概述 本工具通过PySide6构建用户界面,结合PyCATIA库实现CATIA V5的自动化操作,提供两大核心功能: ​空几何体清理:智能识别并删除零件文档中的无内容几何体(Bodies)​空几何图形集清理&#xff1…...

Blender配置渲染设置并输出动画

在Blender中,渲染设置和渲染动画的选项位于不同的面板中。以下是具体步骤: 渲染设置 渲染设置用于配置输出格式、分辨率、帧率等参数。 打开右侧的 属性面板(按 N 键可切换显示)。 点击 “输出属性” 选项卡(图标是…...

Spring 声明式事务应该怎么学?

1、引言 Spring 的声明式事务极大地方便了日常的事务相关代码编写,它的设计如此巧妙,以至于在使用中几乎感觉不到它的存在,只需要优雅地加一个 Transactional 注解,一切就都顺理成章地完成了! 毫不夸张地讲&#xff…...

C++11 引入了的新特性与实例说明

C11 引入了许多重要的新特性&#xff0c;以下是一些关键特性及其对应的示例代码&#xff0c;用于体现这些特性的用法和优势。 1. 自动类型推导 (auto) auto 关键字允许编译器自动推导变量的类型&#xff0c;简化代码书写。 #include <iostream> #include <vector>…...

二手Mac验机过程

1.1 外观检查 螺丝是否拧过螺丝 1.2 关于本机中 序列号&#xff0c;盒子序列号&#xff0c;机器背部 核对参数 https://checkcoverage.apple.com/coverage 1.3 检查apple ID与查找 1 登出 iCloud、iTunes、FaceTime、iMessage 在 Mac 上打開「訊息」應用程式&#xff0c;從上方…...

从 0 到 1 掌握鸿蒙 AudioRenderer 音频渲染:我的自学笔记与踩坑实录(API 14)

最近我在研究 HarmonyOS 音频开发。在音视频领域&#xff0c;鸿蒙的 AudioKit 框架提供了 AVPlayer 和 AudioRenderer 两种方案。AVPlayer 适合快速实现播放功能&#xff0c;而 AudioRenderer 允许更底层的音频处理&#xff0c;适合定制化需求。本文将以一个开发者的自学视角&a…...

Android 13深度定制:SystemUI状态栏时间居中显示终极实战指南

一、架构设计与技术解析 1. SystemUI状态栏核心布局机制 层级结构 mermaid 复制 graph TDPhoneStatusBarView --> StatusBarContents[status_bar_contents]StatusBarContents --> LeftLayout[status_bar_left_side]StatusBarContents --> ClockLayout[Clock控件]Left…...

支持多系统多协议且可提速的下载工具

在网络下载需求日益多样的当下&#xff0c;一款好用的下载器能极大提升效率。今天就给大家介绍 AB Download Manager&#xff0c;它免费又开源&#xff0c;能适配 Windows 和 Linux 系统&#xff0c;带来超便捷的下载体验。 AB Download Manager 采用先进的多线程技术&#xf…...

【leetcode hot 100 22】括号生成

解法一&#xff1a;&#xff08;回溯法&#xff09;用两个整数记录左右括号数&#xff0c;以在回溯过程中保证先生成左括号&#xff0c;且左右括号数不能大于n。 class Solution {public List<String> generateParenthesis(int n) {List<String> result new Arra…...

如何在 HTML 中创建一个有序列表和无序列表,它们的语义有何不同?

大白话如何在 HTML 中创建一个有序列表和无序列表&#xff0c;它们的语义有何不同&#xff1f; 1. HTML 中有序列表和无序列表的基本概念 在 HTML 里&#xff0c;列表是一种用来组织信息的方式。有序列表就是带有编号的列表&#xff0c;它可以让内容按照一定的顺序呈现&#…...

【武汉·4月11日】Parasoft联合光庭信息研讨会|邀您共探AI赋能新机遇

Parasoft联合光庭信息Workshop邀您共探AI赋能新机遇 AI浪潮已至&#xff0c;你准备好了吗&#xff1f; 在智能网联汽车飞速发展的今天&#xff0c;AI技术正以前所未有的速度重塑行业生态。如何把握AI机遇&#xff0c;赋能企业创新&#xff1f; 4月11日&#xff0c;自动化软件…...

PHP PSR(PHP Standards Recommendations)介绍

PHP PSR&#xff08;PHP Standards Recommendations&#xff09;是 PHP 社区制定的一系列标准化规范&#xff0c;旨在统一 PHP 代码的编写方式、接口设计和开发实践&#xff0c;以提高代码的可读性、可维护性和互操作性。以下是核心 PSR 标准的解读和具体使用方法&#xff1a; …...

闻所闻尽:穿透声音的寂静,照见生命的本真

在《楞严经》的梵音缭绕中&#xff0c;"闻所闻尽"四个字如晨钟暮鼓&#xff0c;叩击着每个修行者的心门。这个源自观世音菩萨耳根圆通法门的核心概念&#xff0c;既是佛门修行的次第指引&#xff0c;更蕴含着东方哲学对生命本质的终极叩问。当我们穿越时空的帷幕&…...

F28335进入非法中断ILLEGAL_ISR定位

在非法中断函数中&#xff0c;再调用一个函数接口&#xff0c;比如save_illegal_error()&#xff0c;然后在save_illegal_error中实现如下代码&#xff1a; g_illegal_isr_sp 0;(这个是全局变量&#xff0c;需要先定义 &#xff09; asm( “ MOVW ACC, SP\n” " MOVL …...