简明入门讲义——CAP 理论,鱼和熊掌不可兼得
Posted FesonX
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简明入门讲义——CAP 理论,鱼和熊掌不可兼得相关的知识,希望对你有一定的参考价值。
CAP 理论缘起
开发人员常常要将对性能与扩展性的思考体现在代码中
出现性能(Performance)问题,即单个用户请求是缓慢的
出现扩展(Scalability)问题,即单个用户请求是满足要求的,但系统在高负载下处理用户请求是缓慢的。
如果这个服务是可扩展的,则随着系统资源的增加,服务性能是成比例提升的。
随着可扩展服务系统资源的增加(这里指的是横向扩展(Horizontal Scalability)),系统就会开始变得复杂,出现以往单机不需要考虑的问题。
CAP 概述
于是就有了 CAP 理论:在一个分布式系统中,节点彼此连接共享数据,你有且只能使系统保证一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance)三个中的两个。
一致性:从任一节点读取返回的都是客户端最近一次的写入结果
可用性:访问任一在线(No-Failing)节点均可以在一定时间范围内得到返回结果,而不会产生超时或其他错误
分区容错性:发生网络分区时,系统依然可以运作
实际上的 CAP
分布式计算的谬误
理论上可以满足 CP, AP, AC。 然而这是在理想的网络状态下。
Sun 公司的 Arnon Rotem Gal Oz 提出分布式计算的谬误(Fallacies of distributed computing),理想的网络是:
- 网络是可靠的
- 网络延迟为 0
- 带宽是无限的
- 网络是安全的
- 网络拓扑是不变的
- 系统只有一个管理员
- 传输损耗为 0
- 网络是同构的 (homogeneous)
如果不满足上述的任一条件,那么必须容忍 P,因此实际的 CAP 理论是:在网络分区下,我们只能选择保证一致性或者可用性的一个
现实中的伪 CAP
而在真实的生产环境呢?可能又不一样了!一致性可能退化成了最终一致性,而可用性也只是部分节点可用。
对于一致性,CAP 理论讲的是任一节点都返回最近一次写入结果。而大部分使用共识算法的软件例如 RabbitMQ 的 Quorum Queue 及 Kafka Topic,只要保证多数节点写入成功,即对外允许读取了。包括被外界看做 CP 系统的 Zookeeper 默认也不会在读操作前发送 Sync 命令来保证 CAP 的一致性。对于一些系统而言,延迟更无法忍受。
对于可用性,在网络分区发生时,任一在线的节点不一定能提供服务。例如 RabbitMQ Quorum Queue 的策略是多数节点分区继续工作,少数节点即使已有客户端连接,也会被断开,停止对外提供服务。
Ref
- Understanding Latency versus Throughput
- Please stop calling databases CP or AP
- CAP theorem - Wikipedia
WeChat Official Account: 程序员的碎碎念
以上是关于简明入门讲义——CAP 理论,鱼和熊掌不可兼得的主要内容,如果未能解决你的问题,请参考以下文章