开发者社区> 问答> 正文

分布式系统 CAP 定理 P 代表什么含义【Java问答学堂】55期

分布式系统 CAP 定理 P 代表什么含义

作者之前在看 CAP 定理时抱有很大的疑惑,CAP 定理的定义是指在分布式系统中三者只能满足其二,也就是存在分布式 CA 系统的。作者在网络上查阅了很多关于 CAP 文章,虽然这些文章对于 P 的解释五花八门,但总结下来这些观点大多都是指 P 是不可缺少的,也就是说在分布式系统只能是 AP 或者 CP,这种理论与我之前所认识的理论(存在分布式 CA 系统)是冲突的,所以才有了疑惑。

这个定理起源于加州大学柏克莱分校(University of California, Berkeley)的计算机科学家埃里克·布鲁尔在 2000 年的分布式计算原理研讨会(PODC)上提出的一个猜想。 在 2002 年,麻省理工学院(MIT)的赛斯·吉尔伯特和南希·林奇发表了布鲁尔猜想的证明,使之成为一个定理。

什么是 CAP 定理(CAP theorem)

在理论计算机科学中,CAP 定理(CAP theorem),又被称作布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点:

  • 一致性(Consistency) (等同于所有节点访问同一份最新的数据副本)
  • 可用性(Availability)(每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据)
  • 分区容错性(Partition tolerance)(以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在 C 和 A 之间做出选择。)

分区容错性(Partition tolerance)

理解 CAP 理论的最简单方式是想象两个节点分处分区两侧。允许至少一个节点更新状态会导致数据不一致,即丧失了 C 性质。如果为了保证数据一致性,将分区一侧的节点设置为不可用,那么又丧失了 A 性质。除非两个节点可以互相通信,才能既保证 C 又保证 A,这又会导致丧失 P 性质。

  • P 指的是分区容错性,分区现象产生后需要容错,容错是指在 A 与 C 之间选择。如果分布式系统没有 分区现象(没有出现不一致不可用情况) 本身就没有分区 ,既然没有分区则就更没有分区容错性 P。
  • 无论我设计的系统是 AP 还是 CP 系统如果没有出现不一致不可用。 则该系统就处于 CA 状态
  • P 的体现前提是得有分区情况存在

往期回顾:

【Java问答学堂】1期 为什么使用消息队列?消息队列有什么优点和缺点?Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别,以及适合哪些场景?

【Java问答学堂】2期 如何保证消息队列的高可用?

【Java问答学堂】3期 如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性?

【Java问答学堂】4期 如何保证消息的可靠性传输?(如何处理消息丢失的问题?)

【Java问答学堂】5期 如何保证消息的顺序性?

【Java问答学堂】6期 如何解决消息队列的延时以及过期失效问题?

【Java问答学堂】7期 如果让你写一个消息队列,该如何进行架构设计?

【Java问答学堂】8期 es 的分布式架构原理能说一下么(es 是如何实现分布式的啊)?

【Java问答学堂】9期 es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?

【Java问答学堂】10期 es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?

【Java问答学堂】11期 es 生产集群的部署架构是什么?每个索引的数据量大概有多少?

【Java问答学堂】12期 项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果?

【Java问答学堂】13期 redis 和 memcached 有什么区别?

【Java问答学堂】14期 redis 都有哪些数据类型?分别在哪些场景下使用比较合适?

【Java问答学堂】15期redis 的过期策略都有哪些?内存淘汰机制都有哪些?

【Java问答学堂】16期如何保证 redis 的高并发和高可用?redis 的主从复制原理能介绍

为什么使用消息队列?【Java问答学堂】17期

消息队列有什么优点和缺点?【Java问答学堂】18期

Kafka、ActiveMQ、RabbitMQ、RocketMQ的区别?【Java问答学堂】19期

如何保证消息队列的高可用?【Java问答学堂】20期

如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性?【Java问答学堂】21期

如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题?【Java问答学堂】22期

如何保证消息的顺序性?【Java问答学堂】23期

如何解决消息队列的延时以及过期失效问题?【Java问答学堂】24期

如果让你写一个消息队列,该如何进行架构设计?【Java问答学堂】25期

ES 的分布式架构原理能说一下么(ES 是如何实现分布式的啊)?【Java问答学堂】26期

ES 写入数据的工作原理是什么啊?ES 查询数据的工作原理是什么啊?【Java问答学堂】27期

ES 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?【Java问答学堂】28期

ES 生产集群的部署架构是什么?每个索引的数据量大概有多少?【Java问答学堂】29期

项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果?【Java问答学堂】30期

Redis 和 Memcached 的区别?Redis 的线程模型是什么?【Java问答学堂】31期

Redis 都有哪些数据类型?分别在哪些场景下使用比较合适?【Java问答学堂】32期

Redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现?【Java问答】33期

如何保证 redis 的高并发和高可用?【Java问答】34期

Redis 的持久化有哪几种方式?【Java问答】35期

Redis 集群模式的工作原理能说一下么?【Java问答】36期

了解什么是 Redis 的雪崩、穿透和击穿?Redis 崩溃之后会怎么样?【Java问答】37期

如何保证缓存与数据库的双写一致性?【Java问答】38期

Redis 的并发竞争问题是什么?如何解决这个问题?【Java问答】39期

生产环境中的 Redis 是怎么部署的?【Java问答】40期

为什么要分库分表(设计高并发系统的时候,数据库层面该如何设计)?【Java问答】41期

如何设计才可以让系统从未分库分表动态切换到分库分表上?【Java问答】42期

分库分表之后,id 主键如何处理?【Java问答】43期

你们有没有做 MySQL 读写分离?如何实现 MySQL 的读写分离?【Java问答】44期

如何设计一个高并发系统?【Java问答学堂】45期

为什么要进行系统拆分?如何进行系统拆分?拆分后不用 dubbo 可以吗?【Java问答学堂】46期

dubbo 的工作原理?注册中心挂了的问题?说说一次 rpc 请求的流程?【Java问答】47期

dubbo 支持的通信协议?有哪些序列化协议?说下 Hessian 的数据结构?【Java问答】48期

dubbo 负载均衡策略和集群容错策略都有哪些?动态代理策略呢?【Java问答学堂】49期

dubbo 的 spi 思想是什么?【Java问答学堂】50期

如何基于 dubbo 进行服务治理、服务降级、失败重试以及超时重试?【Java问答学堂】51期

分布式服务接口的幂等性如何设计(比如不能重复扣款)?【Java问答学堂】52期

分布式服务接口请求的顺序性如何保证?【Java问答学堂】53期

如何自己设计一个类似 Dubbo 的 RPC 框架?【Java问答学堂】54期

展开
收起
请回答1024 2020-07-10 14:49:57 4446 0
1 条回答
写回答
取消 提交回答
  • 收藏

    2020-07-10 23:11:43
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载