CAP定理的含义

article/2025/9/24 16:41:41

目录

定理解读

如何抉择


1998年,加州大学的计算机科学家 Eric Brewer 提出了分布式系统的三个指标:

C:Consistency,一致性。在分布式系统中的所有数据备份,在同一时刻具有同样的值,所有节点在同一时刻读取的数据都是最新的数据副本(all nodes see the same data at the same time)。

A:Availability ,可用性,好的响应性能。完全的可用性指的是在任何故障模型下,服务都会在有限的时间内处理完成并进行响应(Reads and writes always succeed)。

P:Partition Tolerance ,分区容错性,即分布式系统在遇到某些节点或网络分区故障的时候,仍然能够对外提供满足一致性或可用性的服务。分区容错性要求一个分布式系统中有某一个或者几个节点故障时,其他剩下的节点还能够正常运转并对外提供服务,对于用户而言并没有什么体验上的影响。

Eric Brewer 指出任何分布式系统只可同时满足CAP三个指标中的两个,无法三者兼顾,这个结论就叫做 CAP 定理。

定理解读

分布式的服务化系统都需要满足分区容忍性,那么我们必须在一致性(C)和可用性(A)之间进行权衡。在网络分区故障发生时,两个分布式节点之间无法进行通信,那么我们对一个节点进行的修改操作将无法同步到另外一个节点,所以数据的一致性(C)将无法满足,因为两个分布式节点的数据不再保持一致。除非我们牺牲可用性(A),也就是在网络分区故障发生时,暂停分布式系统对外提供修改数据服务,直到网络状况完全恢复正常再继续对外提供修改数据服务。

CP满足的情况下,A不能满足的原因:

若要满足一致性(C)就需要在多个分布式节点之间进行数据同步,在数据同步完成之前整个系统都将不可用。节点数量越多分区容错性(P)越好,同时数据同步所耗费的时间自然也就越长,从而无法在有限的时间内完成请求响应,导致可用性(A)不能满足。

CA满足的情况下,P不能满足的原因:

若要满足一致性(C)就需要在多个分布式节点之间进行数据同步,在数据同步完成之前整个系统都将不可用。需同步的节点数量越多,数据同步所需耗费的时间越长,可用性(A)也越差。若要同时保证可用性(A),那么需同步的节点数量就需要尽量减少,从而导致分区容错性(P)无法满足。

AP满足的情况下,C不能满足的原因:

节点的数量越多,分区容错性(P)越好,节点间数据同步所需耗费的时间越长,若要在有限的时间内完成请求响应即保证可用性(A),那么数据就可能不能及时地同步到其他节点,从而无法保证节点间的数据一致性(C)。

如何抉择

对于现如今大多数的互联网应用场景,都倾向于采用分布式微服务架构,它们通常节点众多、部署相对分散,随着集群规模变得越来越大,节点故障、网络故障已是常态。

在这种情况下,对于那些对数据一致性(C)要求不高的场景,例如电商系统,我们只需要保证分区容错性(P)和可用性(A),对于数据一致性(C)退而求其次仅保证数据的最终一致性即可。这虽然会某些地方影响客户体验,但并不会达到造成用户流失的严重程度。

对于像银行系统这类对数据一致性(C)要求较高的场景,数据一致性(C)必须保证。网络发生故障宁可停止服务(或者只读不写),这是保证分区容错性(P)和数据一致性(C),舍弃可用性(A)。

目前比较主流的注册中心有 Zookeeper、Eureka、Consul、Etcd 等,以Zookeeper 和Eureka为例, 在进行注册中心选择时,CAP又该如何抉择呢?

Zookeeper:CP设计,保证了一致性,集群搭建的时候,某个节点失效,则会进行选举新的Leader,或者半数以上节点不可用,则无法提供服务,因此可用性(A)没法满足。

Eureka:AP设计,无主从节点,一个节点挂了,自动切换其他节点继续使用,去中心化,但数据一致性(C)不满足。

在分布式系统中分区容错性(P)肯定要满足,所以只能在CA中二选一, 没有最好的选择,只有更适合的,我们需要根据自己的业务场景来进行架构设计:

  • 如果要求一致性,则选择 Zookeeper,如金融行业

  • 如果要求可用性,则选择 Eureka,如电商系统

 


http://chatgpt.dhexx.cn/article/ubZPD55O.shtml

相关文章

CAP定理是什么?

写在前面 本文隶属于专栏《100个问题搞定大数据理论体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和文献引用请见100个问题搞定大数据理论体系 解答 分布式系统不…

分布式CAP定理,为什么不能同时满足三个特性?

在弄清楚这个问题之前,我们先了解一下什么是分布式的CAP定理。 根据百度百科的定义,CAP定理又称CAP原则,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、P…

AMBA总线理解-AXI总线

AXI的设计目标是可以在高始终频率下运行,并且在迟滞时间长的情况下也可以达到高数据吞吐率。他可以将读/写请求和读/写结果相互分离,将数据写入和数据读出的信号分类,并且可以同时进行写入和读出的动作,因此可以大幅度提升数据吞吐…

Zynq AXI总线

S02_CH12_ AXI_Lite 总线详解 - 米联客 - 博客园 12.1前言 ZYNQ拥有ARMFPGA这个神奇的架构,那么ARM和FPGA究竟是如何进行通信的呢?本章通过剖析AXI总线源码,来一探其中的秘密。 12.2 AXI总线与ZYNQ的关系 AXI(Advanced eXtens…

AXI总线协议介绍

AXI总线协议介绍 AXI(Advanced eXtensible Interface)协议是一种面向高性能、高带宽系统设计的总线协议,能够满足各种高速系统的总线协议,能够满足各种高速系统的总线互连。 AXI协议的主要特点有: 独立的地址,控制和数据接口支持使用字节选通的不对齐数据的传输基于特定地…

AXI总线入门

介绍【只要涉及到芯片内部交换都是涉及到AXI协议】 ZYNQFPGAARM 两者间的数据传输 AXI(Advanced extensible Interface)高级外设总线协议,协议是一种通用总线协议,AXI协议是ARM AMBA(Advanced Microcontroller Bus Arc…

AXI 总线协议学习笔记(4)

引言 前面两篇博文从简单介绍的角度说明了 AXI协议规范。 AXI 总线协议学习笔记(2) AXI 总线协议学习笔记(3) 从本篇开始,详细翻译并学习AXI协议的官方发布规范。 AXI总线协议,是一个处于不断发展和完…

浅谈AXI总线

这篇博客在写之前借鉴了网上各位大佬对AXI总线的理解和总结,在此表示感谢。集合了博客,知乎以及书上对AXI总线的介绍。做以下记录用于自己日后复习和更好的理解。 1:协议简介 Xilinx fpga 从Virtex-6系列开始,内部IP都支持AXI4总…

AXI总线整理总结

AXI总线 一、Definition 嵌入式系统是当今计算机工业发展的一个热点,随着超大规模集成电路的迅速发展,半导体工业进入深亚微米时代,器件特征尺寸越来越小,芯片规模越来越大,可以在单芯片上集成上百万到数亿只晶体管。…

AXI 总线协议学习笔记(3)

引言 上篇文章主要介绍了 AMBA以及AXI协议的基本内容,本文接续前文,继续介绍AXI协议的 原子访问、传输行为和事务顺序等。 AXI 总线协议学习笔记(2)https://blog.csdn.net/qq_43045275/article/details/128824643 原子访问 原子…

AXI总线总结

目录 1 综述 2 AXI通道概述 2.1 综述 2.2 读地址与写地址通道 2.3 读数据通道 2.4 写数据通道 2.5 写响应通道 3 AXI互联结构 4 AXI中使用寄存器切片 5 AXI术语 5.1 AXI组件与拓扑 5.2 AXI传输与存储器类型 6 AXI信号描述 6.1 公共信号 6.2 写地址通道信号 6.3…

AXI总线

AXI总线 AXI总线简介 AXI总线是一种总线协议,是ARM公司提出的AMBA3.0协议(目前已AXI4已发布) 中的最重要的部分,是一种高性能、高带宽、低延时的片内总线。支持不对齐的数据传输和突发传输。在突发传输中只需要首地址,并且支持同时分离的读…

SoC设计与验证——总线篇——AXI总线

1. AXI总线特征 axi总线可以连接CPU的cache和其他外设,比如内存等。内存是从属设备,它接受信号,并驱动ready信号;主从设备都会驱动data信号,总线仲裁器只看request和grant信号,而忽略所有的其他信号。 详…

AXI总线简介

0.绪论 AXI是高级扩展接口,在AMBA3.0中提出,AMBA4.0将其修改升级为AXI4.0。AMBA4.0 包括AXI4.0、AXI4.0-lite、ACE4.0、AXI4.0-stream AXI4.0-lite是AXI的简化版本,ACE4.0 是AXI缓存一致性扩展接口,AXI4.0-stream是ARM公司和Xilinx公司一起提出,主要用在FPGA进行以数据为主…

calender控件应用

历控件是.net自带的控件之一,功能强大,在很多项目开发中都有用到,对于blog系统来说更是必不可少。纵是好玉也仍需雕琢,为了使它更美观实用,我们还需要对它进行二次开发。   新建一个用户控件,把cale…

CalendarPicker

CalendarPicker 项目地址:maxyou/CalendarPicker 简介:A calendar picker to select a day. Can preset a selected day. 更多:作者 提 Bug 标签: Calendar Picker Can preset a selected day. Can customize almost al…

vue-calender

​​ 实现功能 生成当月的日历&#xff0c;并且标记当天的日期在输入框中输入日期会跳转到对应的月份&#xff0c;并标记输入的日期中间两个按钮( < >)控制月份的更改&#xff0c;可以切换月份旁边两个按钮( << >>)控制月份的更改&#xff0c;可以切换年份…

Java Calender类的一些常用方法

Calendar 日期类介绍 Calendar c Calendar.getInstance();//创建实例 默认是当前时刻   c.get(Calendar.YEAR);   c.get(Calendar.MONTH);   c.get(Calendar.DATE);//获取年,月,日 当然时分秒也可以 注意这里的月份比较特殊 从0开始   c.get(Calendar.DAY_OF_WEE…

Java日期Canlender

java.util.Carlendar介绍: Calendar 类是一个抽象类&#xff0c;它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等日历字段之间的转换提供了一些方法&#xff0c;并为操作日历字段&#xff08;例如获得下星期的日期&#xff09;提供了一些方法。 Calendar 提供了一个…