cap理论具体含义_架构设计之「 CAP 定理 」

66ae2fb03b1825dc1f618e41c0756f71.png

在计算机领域,如果是初入行就算了,如果是多年的老码农还不懂 CAP 定理,那就真的说不过去了。CAP可是每一名技术架构师都必须掌握的基础原则啊。
现在只要是稍微大一点的互联网项目都是采用 分布式 结构了,一个系统可能有多个节点组成,每个节点都可能需要维护一份数据。那么如何维护各个节点之间的状态,如何保障各个节点之间数据的同步问题就是大家急需关注的事情了。
CAP定理是分布式系统中最基础的原则。所以理解和掌握了CAP,对系统架构的设计至关重要。

一、什么是 CAP?
「 CAP定理 」又被称为 布鲁尔定理,它提出对于一个分布式系统而言,不能同时满足以下三点:

  • Consisteny(一致性)
  • Availability(可用性)
  • Partition tolerance(分区容错性)

也就是说CAP定理指明了,任何分布式系统只能同时满足这三项中的两项。

81de1aac91736cd6c13d9d8939d388c4.png

如上图,如果是最多同时满足两项,那我们可以有三个组合:CA、CP、AP。在聊这三个组合之前,我们先分别看一下 Consisteny(一致性)、Availability(可用性)、Partition tolerance(分区容错性)的含义。
假设某个系统当前有两个节点A和B,两个节点分别可以由Actor进行读写,两个节点之间的数据会自动完成同步。

12181a368c28244bbb2b52757cf6b440.png
  1. Consisteny(一致性)
    一致性的要求是指,对于任何客户端(上图Actor)来说,每次的读操作,都能获得最新的数据。即,当有客户端向A节点写入了新数据之后,其它客户端从B节点中进行读操作所获得的数据必须也是最新的,是与A节点数据保持一致的。
  2. Availability(可用性)
    可用性的要求是指,每个请求都能在合理的时间内获得符合预期的响应(不保证获取的结果是最新的数据)。
    按照上图来看就是,客户端只要向A节点或B节点发起请求后,只要这两个节点收到了请求,就必须响应给客户端,但不需要保证响应的值是否正确。
  3. Partition tolerance(分区容错性)
    分区容错性是指,当节点之间的网络出现问题之后,系统依然能正常提供服务。

讲完了C、A、P的含义和要求,我们继续来看看它们之间如何组合使用。二、CAP 怎么应用?
先把视野回到这张图上:

81de1aac91736cd6c13d9d8939d388c4.png

虽然我们知道有 CA、CP、AP 三种组合方式,但是在分布式系统的结构下,网络是不可能做到100%可靠的。既然网络不能保证绝对可靠,那 P(分区容错性)就是一个必选项了。原因如下:
如果选择 CA组合,放弃 P(分区容错性)。还是以最上面的图中A和B节点来举例,当发生节点间网络故障时,为了保证 C(一致性),那么就必须将系统锁住,不允许任何写入操作,否者就会出现节点之间数据不一致了。但是锁住了系统,就意味着当有写请求进来的时候,系统是不可用的,这一点又违背了 A(可用性)原则。
因此分布式系统理论上是不可能有CA组合的,所以我们只能选择 CP 和 AP组合架构。
下面我们来详细看一下 CP架构 和 AP架构的特点:

  1. CP 架构
    CP架构即 Consisteny(一致性)与 Partition tolerance(分区容错性)的组合。

d270f7b4bdb456afba1ed59af6d3bb23.png


如上图,由于网络问题,节点A和节点B之前不能互相通讯。当有客户端(上图Actor)向节点A进行写入请求时(准备写入Message 2),节点A会不接收写入操作,导致写入失败,这样就保证了节点A和节点B的数据一致性,即保证了Consisteny(一致性)。
然后,如果有另一个客户端(上图另一个Actor)向B节点进行读请求的时候,B请求返回的是网络故障之前所保存的信息(Message 1),并且这个信息是与节点A一致的,是整个系统最后一次成功写入的信息,是能正常提供服务的,即保证了Partition tolerance(分区容错性)。
上述情况就是保障了CP架构,但放弃了Availability(可用性)的方案。

  1. AP 架构
    AP架构即 Availability(可用性)与 Partition tolerance(分区容错性)的组合架构。

12181a368c28244bbb2b52757cf6b440.png


如上图,由于网络问题,节点A和节点B之前不能互相通讯。当有客户端(上图Actor)向节点A进行写入请求时(准备写入Message 2),节点A允许写入,请求操作成功。但此时,由于A和B节点之前无法通讯,所以B节点的数据还是旧的(Message 1)。当有客户端向B节点发起读请求时候,读到的数据是旧数据,与在A节点读到的数据不一致。但由于系统能照常提供服务,所以满足了Availability(可用性)要求。
因此,这种情况下,就是保障了AP架构,但其放弃了 Consisteny(一致性)。

三、CAP 注意事项?
了解了CAP定理后,对于开发者而言,当我们构建服务的时候,就需要根据业务特性作出权衡考虑,哪些点是当前系统可以取舍的,哪些是应该重点保障的。
即使是在同一个系统中,不同模块的数据可能应用的CAP架构都是不同的。举个例子,在某个电商系统中,属于用户模块的数据(账密、钱包余额等)对一致性的要求很高,就可以采用CP架构。而对于一些商品信息方面的数据对一致性要求没那么高,但为了照顾用户体验,所以对可用性要求更高一些,那么这个模块的数据就可以采用AP架构。
另外,虽然上面第二节讲到过我们只能选择CP和AP,无法选择CA。但这句话成立的前提条件是在系统发生了网络故障的情况下。然而,网络故障的概率在系统的整个生命周期中占比是很小的,因此我们在设计的时候,虽然要考虑网络问题下的方案,但也要考虑网络正常情况下的方案,即在网络正常情况下,CA是可以实现的,我们也需要去保证在绝大多数时间下的CA架构。
再者,即使我们按照CAP定理,三个中只能取其二,但不代表我们只需要保障其中的两点,而完全的放弃第三点,我们应该为不能保障的第三点也做一些防备措施或者冗余方案,来使系统更加的完善健全。


以上,就是对CAP定理的一些思考。


本文原创发布于微信公众号「 不止思考 」,欢迎关注,一起提升 认知、工作成长、大数据、架构、Web等技术。

码字不易啊,喜欢的话各位看官不妨转发朋友吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用于zsh的高亮插件 zsh-syntax-highlighting

文章目录简介安装配置简介 zsh-syntax-highlighting 插件为 shell zsh 提供语法高亮显示。当命令在 zsh 提示符下输入到交互式终端时,它可以突出显示命令。这有助于在运行命令之前检查命令,特别是捕获语法错误。 主页地址:https://github.c…

项目不能使用fn标签_无服务器,Java和FN项目的第一步

项目不能使用fn标签无服务器不是什么新事物,但是可以说,仍然有很多关于它的炒作,以及它将如何改变一切,以及未来将如何成为无服务器。 除了云提供商提供的无服务器/功能之外,还有越来越多的无服务器项目正在我们的路上…

tomcat目录下创建临时文件,长时间没有使用会被系统清理掉

原因 原因:在linux系统中,spring boot应用服务每次使用java -jar启动后都会在/tmp目录下生成如下目录: hsperfdata_root tomcat.***.9008(中间是一串数字,结尾是应用端口号) tomcat-docbase..9008&#x…

iTerm2的颜色主题/配色主题/配色方案

文章目录直接下载配色方案包使用命令下载安装配色方案直接下载配色方案包 GitHub 主页地址:https://github.com/mbadolato/iTerm2-Color-Schemes 颜色方案下载地址:https://iterm2colorschemes.com/ 下载压缩包后对其进行解压缩,打开目录找…

android 技能标签功能_iOS和Android用户体验设计差异

摘要:iOS和Android用户体验设计差异关键词:iOS,Android,用户体验设计本文将讨论iOS和Android之间的具体设计差异。基本差异1、设计规范 iOS和Android遵循不同的设计规范。2、度量单位 iOS应用程序设计是在pt中开发的,而…

java线程池返回线程状态_Java线程的不同状态

java线程池返回线程状态介绍 在Java中,线程可以具有状态。 Thread.State枚举定义Java线程可以具有的不同状态。 该枚举定义了以下值– 新 可运行 已封锁 等候 TIMED_WAITING 已终止 在随后的部分中,我将简要概述这些状态以及它们之间的可能过渡。…

远程Linux主机安装Oh My Zsh

文章目录介绍安装安装后介绍 Oh My Zsh is an open source, community-driven framework for managing your Zsh configuration. 安装 如果你的服务器没有安装 zsh,则要先安装 zsh: yum install zsh要先安装 git: yum install git然后安…

处理Nginx返回octet-stream数据流的配置

解决 修改Nginx的配置将add_header Content-length 0;删除,处理 Content-Type为application/octet-stream 一、请求报文 二、异常信息 对应前端页面的异常信息为: Network Error epoll_wait() reported that client prematurely closed c…

multi task训练torch_Multi-task Learning的三个小知识

本文译自Deep Multi-Task Learning – 3 Lessons Learned by Zohar Komarovsky在过去几年里,Multi-Task Learning (MTL)广泛用于解决多个Taboola(公司名)的业务问题。在这些业务问题中, 人们使用一组相同的特征以及深度学习模型来…

java8多线程运行程序_线程,代码和数据–多线程Java程序实际运行的方式

java8多线程运行程序有些事情是您在学术或培训班上没有学到的,经过几年的工作经验后才逐渐了解,然后才意识到,这是非常基本的事情,我为什么错过了这么多年。 了解多线程Java程序的执行方式就是其中之一。 您肯定已经听说过线程&am…

zsh命令行界面/zsh终端界面粘贴卡顿的问题

因为安装了某些zsh插件导致,在zsh命令行中粘贴文本非常卡顿,解决方案就是把下面的代码复制到 ~/.zshrc 文件中: pasteinit() {OLD_SELF_INSERT${${(s.:.)widgets[self-insert]}[2,3]}zle -N self-insert url-quote-magic # I wonder if youd…

java连接mongodb的jar包_Java实战之管家婆记账系统(1)——项目简述

项目简述:该项目是一个通过JavaFX实现的管家婆记账系统,具有记账的功能。使用软件:IntelliJ IDEA 2018.3.5(Ultim ate Edition):编写Java项目代码。JavaFX Scene Builder 2.0:生成fxml界面文件。Navicat for MySQL&…

oauth2.0协议流程_正确的工作流程:我应该使用哪个OAuth 2.0流程?

oauth2.0协议流程什么是OAuth 2.0 OAuth 2.0是一个已被广泛采用的委托授权框架,已经存在了很多年,并且似乎已经存在。 如果您不熟悉OAuth 2.0的基本概念,可以使用 川崎孝彦写的优秀文章 。 这只是OAuth 2.0各方的简要提醒: 资源…

远程Linux主机安装zsh插件zsh-syntax-highlighting

安装说明: https://github.com/zsh-users/zsh-syntax-highlighting/blob/master/INSTALL.md 根据安装说明: 1.Clone this repository in oh-my-zsh’s plugins directory: git clone https://github.com/zsh-users/zsh-syntax-highlightin…

scare机器人如何手眼标定_基于视觉伺服的工业机器人系统研究(摄像机标定、手眼标定、目标单目定位)...

击上方“新机器视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达标定技术常见的机器人视觉伺服中要实现像素坐标与实际坐标的转换,首先就要进行标定,对于实现视觉伺服控制,这里的标定不仅包括摄像机标定…

单元测试junit参数_使用Junit参数在更少的时间内编写更好的单元测试

单元测试junit参数大多数人都知道单元测试的重要性和好处,以及为什么要在进行的项目中使用它们。 而且,大多数人不喜欢在他们从事的项目中编写单元测试。 TDD的人当然处于另一面,但根据我的经验,他们在IT行业中是少数派。 说到我…

Linux CentOS安装zsh插件提示/usr/bin/env: python: No such file or directory。

执行 ./install.py 文件时,提示: /usr/bin/env: python: No such file or directory查看系统已安装的 python 版本: ➜ ~ ls -l /usr/bin | grep python lrwxrwxrwx 1 root root 36 11月 2 18:11 python -> /etc/alternativ…

3l如何使用_慢阻肺患者如何选购呼吸机和制氧机,需要注意哪些?

慢阻肺(COPD)是慢性阻塞性肺疾病的简称,进一步发展为肺心病和呼吸衰竭的常见慢性疾病。与有害气体及有害颗粒的异常炎症反应有关,致残率和病死率很高,全球大约有2.1亿人患有慢阻肺,中国大概约有4000-8000万人。慢阻肺已成为全球范…

apache ignite_通过示例获取Apache Ignite Baseline拓扑

apache ignite点燃基准拓扑或BLT代表群集中的一组服务器节点,这些服务器节点将数据持久存储在磁盘上。 其中,N1-2和N5服务器节点是具有本机持久性的Ignite集群的成员,该集群使数据能够持久存储在磁盘上。 N3-4和N6服务器节点是Ignite群集的…

自定义报错返回_MybatisPlus基础篇学习笔记(五)------自定义sql及分页查询

本章目录自定义sql分页查询1. 自定义sql在dao文件中编写自定义接口,并在方法上使用注解形式注入SQL,如图所示:第一种:第二种① application.yml加入下面配置mybatis-plus:mapper-locations: com/ethan/mapper/*② MemberMapper.ja…