专栏首页程序员的碎碎念简明入门讲义——CAP 理论,鱼和熊掌不可兼得

简明入门讲义——CAP 理论,鱼和熊掌不可兼得

Shot by @FesonX

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),理想的网络是:

1.网络是可靠的2.网络延迟为 03.带宽是无限的4.网络是安全的5.网络拓扑是不变的6.系统只有一个管理员7.传输损耗为 08.网络是同构的 (homogeneous)

如果不满足上述的任一条件,那么必须容忍 P,因此实际的 CAP 理论是:在网络分区下,我们只能选择保证一致性或者可用性的一个

现实中的伪 CAP

而在真实的生产环境呢?可能又不一样了!一致性可能退化成了最终一致性,而可用性也只是部分节点可用。

对于一致性,CAP 理论讲的是任一节点都返回最近一次写入结果。而大部分使用共识算法的软件例如 RabbitMQ 的 Quorum Queue 及 Kafka Topic,只要保证多数节点写入成功,即对外允许读取了。包括被外界看做 CP 系统的 Zookeeper 默认也不会在读操作前发送 Sync 命令来保证 CAP 的一致性。对于一些系统而言,延迟更无法忍受。

对于可用性,在网络分区发生时,任一在线的节点不一定能提供服务。例如 RabbitMQ Quorum Queue 的策略是多数节点分区继续工作,少数节点即使已有客户端连接,也会被断开,停止对外提供服务

Ref

1.Understanding Latency versus Throughput(https://community.cadence.com/cadence_blogs_8/b/sd/posts/understanding-latency-vs-throughput)2.Please stop calling databases CP or AP (https://martin.kleppmann.com/2015/05/11/please-stop-calling-databases-cp-or-ap.html)3.CAP theorem - Wikipedia(https://en.wikipedia.org/wiki/CAP_theorem)

本文分享自微信公众号 - 程序员的碎碎念(gh_53e607dd4782),作者:FesonX

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-05-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 包子分布式系统科普系列 1

    欢迎大家订阅包子leetcode的视频讲解: https://www.youtube.com/c/baozitraining 通过这一段时间的观察发现,多数学员...

    包子面试培训
  • 从NoSQL运动谈分布式系统的CAP、BASE理论

    自从上世纪80年代以降,关系型数据库(即传统的OLTP和OLAP数据库)一直都是后端业务系统的主导,能够满足很多需求。但是,随着数据量的激增、对查询响应要求提升...

    王知无-import_bigdata
  • 中国博士生提出最先进AI训练优化器,收敛快精度高,网友亲测:Adam可以退休了

    但是鱼和熊掌不可兼得。Adam、RMSProp这些算法虽然收敛速度很快,当往往会掉入局部最优解的“陷阱”;原始的SGD方法虽然能收敛到更好的结果,但是训练速度太...

    量子位
  • 「镁客·请讲」博雅工道熊明磊:专注消费者体验,做没有“尾巴”的水下机器人

    镁客网
  • 普通程序员该如何进阶为全栈工程师?

    如何成为一名全栈工程师(full stack developer)?互联网最热的话题之一。LinkedIn, Facebook上标榜自己是全栈工程师的人也越来...

    奔跑的小鹿
  • 你用的Web服务器过时了吗?全球使用排名第五的竟然是...

    对服务端工程师来说,如果你的工作中涉及 Nginx、高性能、高并发、动态控制、性能测试、分析等,那么,不论你使用什么开发语言和平台,OpenResty 都是不可...

    java思维导图
  • 中国博士生提出最先进AI训练优化器,收敛快精度高,网友亲测:Adam可以退休了

    但是鱼和熊掌不可兼得。Adam、RMSProp这些算法虽然收敛速度很快,当往往会掉入局部最优解的“陷阱”;原始的SGD方法虽然能收敛到更好的结果,但是训练速度太...

    代码医生工作室
  • 中国博士生提出最先进AI训练优化器,收敛快精度高,网友亲测:Adam可以退休了

    但是鱼和熊掌不可兼得。Adam、RMSProp这些算法虽然收敛速度很快,当往往会掉入局部最优解的“陷阱”;原始的SGD方法虽然能收敛到更好的结果,但是训练速度太...

    算法工程师之路
  • 会玩Go!会玩Python!嘭!Go-Python!

    Golang是静态语言,性能很好,当它不那么灵活,不好在运行时动态运行代码。Python是动态语言,非常灵活,但是性能很差。古人云:“鱼和熊掌不能兼得”。但是如...

    老钱

扫码关注云+社区

领取腾讯云代金券