立即注册找回密码

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

手机动态码快速登录

手机号快速注册登录

搜索

图文播报

查看: 131|回复: 2

[分享] 如何理解 CAP 理论?

[复制链接]
发表于 2024-12-14 17:47 | 显示全部楼层 |阅读模式
回复

使用道具 举报

发表于 2024-12-14 17:47 | 显示全部楼层
一、背景

随着互联网规模和用户需求的不断增长,分布式系统成为构建大规模应用的必然选择。在分布式系统中,数据和计算资源被分散在多个节点上,带来了许多挑战。其中一个关键问题是如何在网络分区或故障情况下保持一致性和可用性。CAP理论由Eric Brewer于2000年提出,帮助我们理解在分布式系统中这三个重要特性之间的取舍。
二、CAP理论的原理



CAP理论指出,在一个分布式系统中,不可能同时满足以下三个属性:

  • 一致性(Consistency):所有节点在同一时刻是否看到相同的数据视图。
  • 可用性(Availability):每个请求是否都能在有限的时间内得到响应,不保证返回最新的数据。
  • 分区容错性(Partition Tolerance):即使在网络分区的情况下,系统仍能继续工作。
三、CAP理论的应用

在实际应用中,根据系统需求和业务场景,我们需要根据CAP理论权衡这三个属性。不同的系统可以在以下方式中进行选择:

  • CA系统:在一些传统的关系型数据库系统中,一致性和可用性被认为是首要考虑的,而分区容错性则相对较弱。这意味着在网络分区发生时,系统会选择阻塞请求以保持数据的一致性,以确保所有节点看到的数据是相同的。这对于某些数据的强一致性需求很重要,但可能导致系统整体的可用性降低。典型代表如MySQL和PostgreSQL;
  • CP系统:在一些分布式数据库系统中,一致性和分区容错性被认为是首要考虑的,而可用性可能会受到一些限制。系统将优先保持数据的一致性和容错性,但可能会在网络分区时牺牲一部分可用性。典型代表如Google的分布式存储系统Bigtable,以及基于Bigtable的开源实现HBase;
  • AP系统:许多大规模互联网应用程序更倾向于追求可用性和分区容错性,而在一致性方面可能做出一些妥协。这些系统通常通过在不同节点之间进行数据复制来提高可用性,并允许在某些情况下返回部分陈旧的数据。典型代表如Amazon的分布式键值存储系统Dynamo;
四、关于CAP理论的思考

CAP理论是分布式系统设计中的一个重要指导原则,但它也存在一些缺陷和局限性。

  • CAP理论将分布式系统的属性简化为三个二进制选择:一致性、可用性和分区容错性。实际上,分布式系统的属性是连续的,并且可以在不同的条件下进行灵活权衡。因此,CAP理论的二分法在某些情况下可能过于简化了问题,无法涵盖所有实际场景;
  • CAP理论没有考虑网络延迟对系统行为的影响。在现实中,网络通信是分布式系统中的主要瓶颈之一,而且网络延迟是不可忽视的。CAP理论假设在有限的时间内完成通信和处理,但实际情况可能因为网络延迟而导致无法在有限时间内完成;
  • CAP理论指出分布式系统不可能同时满足三个属性。然而,对于某些特殊情况和特定的系统设计,实际上可能会近乎同时满足这三个属性。因此,CAP理论在一定程度上可以被绕过或钻空子,不是一个严格的定理;
针对上述论述,我们可以找到一些典型代表作为参考

  • Apache Cassandra:Cassandra是一个分布式、去中心化的NoSQL数据库系统。它在一致性、可用性和分区容错性之间采用了灵活的权衡策略。用户可以根据应用需求配置Cassandra的一致性级别,以获得最合适的系统行为。
  • Apache Kafka:Kafka是一个高吞吐量的分布式发布-订阅消息传递系统。它更加注重可用性和分区容错性,而对于一致性有一些灵活性。Kafka使用分区复制机制来实现容错性,并允许用户根据需求设置消息传递的一致性级别。
所以,系统的CAP属性不是静态不变的,而是可以根据系统配置和设计进行调整。很多系统提供了一致性级别的配置选项,允许用户根据实际需求在一致性和可用性之间进行权衡。
五、总结

CAP理论为我们在设计和选择分布式系统时提供了一个重要的指导原则。我们需要根据系统的需求、数据的重要性以及对一致性和可用性的需求程度,来选择最适合的系统模型。权衡这三个属性,理解系统的妥协是设计可靠、高效分布式系统的关键。在实际应用中,可能需要综合运用不同的技术手段和策略,来达到最优的系统设计。
另外,我们也要考虑到CAP理论存在一些缺陷,开发人员和系统设计者在设计分布式系统时考虑CAP理论的同时,还需要综合考虑其他因素,并结合具体场景和需求来做出最优的系统设计决策。

本篇文章转载自天翼云官方网站开发者社区,了解更多云计算知识可登录天翼云官方网站开发者社区,点击专栏查看更多技术干货,与技术大咖促膝论道!


往期回顾:MongoDB之SCRAM认证- 知乎 (zhihu.com)
回复 支持 反对

使用道具 举报

发表于 2024-12-14 17:48 | 显示全部楼层
现在企业招聘开发,基本都会要求有分布式系统的开发经验,许多面试题也是针对分布式环境下会出现的问题提出。想要在Java开发的道路走上去,熟悉分布式系统可以说是必须的。而CAP理论是业界进行分布式系统设计的一种重要思想,下面就让我们来看看吧。
什么是CAP

CAP是由美国计算机科学家Leslie Lamport在1974年提出的一种理论,他指出一个分布式系统不可能同时满足以下3点情况:
1.一致性(Consistency):

假如你有N份冗余备份的数据,那么同一时刻,无论你读取哪一份数据,都必须确保数据是相同的,我保证每一份数据都是最新的。
2.可用性(Availability):

你的系统必须每周007不间断地进行工作,随叫随到,做一个资本家听了都流泪的好员工。
3.分区容错性(Partition tolerance):

现实生活中,分布式系统经常是集群部署的,网络经常是不可靠的,可能发生丢包,网络故障,甚至某个机房被大水淹了。就算是再怎么糟糕的情况,也要确保系统是可用的,不会崩。
鱼与熊掌不可兼得



举个简单的例子: 我们去签租房合同,一式两份。你们签完第一份合同,要开始签第二份合同时,房东拉肚子(网络故障)跑出去了。摆在你面前有两种选择:
1.你坐在沙发上发呆(牺牲可用性),等待房东从茅厕回来,继续签完合同(分区容错性)。这样无论拿走那份合同,都是一模一样的数据。
2.你赶时间,谁便抓起一份合同就走(可用性),但是拿走的那份合同可能是还没签完的那份(牺牲一致性
做人需取舍

CA without P

这个看起来就不像是分布式系统该做的选择,而是为单机系统准备的。网络延迟与数据丢失是不可避免的,我们必须要保证自己的系统不能挂掉
CP wihtout A

为了拿到的数据是最新的,在网络故障的情况下,陷入长时间等待,牺牲用户使用体验
AP without C

牺牲数据一致性,比如你正在抢12306火车票,明明页面上显示还有3张票。然后你一下单,提示你票没了。感觉在欺骗我感情。
没有最好的策略,高明的架构师需要根据业务场景去做取舍。
回复 支持 反对

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册 微信登录 手机动态码快速登录

本版积分规则

关闭

官方推荐 上一条 /3 下一条

快速回复 返回列表 客服中心 搜索 官方QQ群 洽谈合作
快速回复返回顶部 返回列表