极客时间:《从 0 开始学架构》:想成为架构师,你必须掌握的CAP细节

1、CAP 关键细节点

埃里克·布鲁尔(Eric Brewer)在《CAP 理论十二年回顾:“规则”变了》(http://www.infoq.com/cn/articles/cap-twelve-years-later-how-the-rules-have-changed)一文中详细地阐述了理解和应用 CAP 的一些细节点,提炼如下:

  • CAP 关注的粒度是数据,而不是整个系统。

    在实际设计过程中,每个系统不可能只处理一种数据,而是包含多种类型的数据,有的数据必须选择 CP,有的数据必须选择 AP

    所以在 CAP 理论落地实践时,我们需要将系统内的数据按照不同的应用场景和要求进行分类,每类数据选择不同的策略(CP 还是 AP),而不是直接限定整个系统所有数据都是同一策略。

  • CAP 是忽略网络延迟的。

    布鲁尔在定义一致性时,并没有将延迟考虑进去。也就是说,当事务提交时,数据能够瞬间复制到所有节点,即事物提交时,数据能够瞬间复制到所有节点,但实际情况并非如此。

  • 正常运行情况下,不存在 CP 和 AP 的选择,可以同时满足 CA。

    CAP 理论告诉我们分布式系统只能选择 CP 或者 AP,但其实这里的前提是系统发生了“分区”现象。如果系统没有发生分区现象,也就是说 P 不存在的时候(节点间的网络连接一切正常),我们没有必要放弃 C 或者 A,应该 C 和 A 都可以保证,这就要求架构设计的时候既要考虑分区发生时选择 CP 还是 AP,也要考虑分区没有发生时如何保证 CA。

  • 放弃并不等于什么都不做,需要为分区恢复后做准备。

2、ACID

ACID 是数据库管理系统为了保证事务的正确性而提出来的一个理论,ACID 包含四个约束,分别是:

1.Atomicity(原子性)

一个事务中的所有操作,要么全部完成,要么全部不完成,不会在中间某个环节结束。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。

2.Consistency(一致性)

在事务开始之前和事务结束以后,数据库的完整性没有被破坏。

3.Isolation(隔离性)

数据库允许多个并发事务同时对数据进行读写和修改的能力。隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

4.Durability(持久性)

事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

ACID 中的 C 是指数据库的数据完整性,而 CAP 中的 C 是指分布式节点中的数据一致性。ACID 的应用场景是数据库事务,CAP 关注的是分布式系统数据读写。

3、BASE

BASE 是指基本可用(Basically Available)、软状态( Soft State)、最终一致性( Eventual Consistency),核心思想是即使无法做到强一致性(CAP 的一致性就是强一致性),但应用可以采用适合的方式达到最终一致性。

1. 基本可用(Basically Available)

分布式系统在出现故障时,允许损失部分可用性,即保证核心可用。

2. 软状态(Soft State)

允许系统存在中间状态,而该中间状态不会影响系统整体可用性。这里的中间状态就是 CAP 理论中的数据不一致。

3. 最终一致性(Eventual Consistency)

系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。

BASE 理论本质上是对 CAP 的延伸和补充,更具体地说,是对 CAP 中 AP 方案的一个补充。前面在剖析 CAP 理论时,提到了其实和 BASE 相关的两点:

  • CAP 理论是忽略延时的,而实际应用中延时是无法避免的。
  • AP 方案中牺牲一致性只是指分区期间,而不是永远放弃一致性。

综合上面的分析,ACID 是数据库事务完整性的理论,CAP 是分布式系统设计理论,BASE 是 CAP 理论中 AP 方案的延伸。

CAP 关键细节点与ACID、BASE的比较的更多相关文章

  1. 关于“创业者与VC见面的10个不成文细节点”

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:Will Wang链接:http://www.zhihu.com/question/19641135/answer/50974 ...

  2. 【JAVA】高并发优化细节点

    高并发优化细节点: 微服务化 如何发现系统瓶颈?   如何高效利用有限内存: 使用基本类型 使用数组,不用集合 自定义map与数据结构   Integer—>int, Set<Intege ...

  3. 关于Vue父子组件传值(复杂数据类型的值)的细节点

    vue 父子组件传值是很常见的,多数情况下都是父传递给子的值是基础数据类型,如string,number,boolean, 当父组件值被修改时,子组件能够实时的作出改变. 如果父子传值的类型是复杂数据 ...

  4. CAP原理、一致性模型、BASE理论和ACID特性

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

  5. CAP定理与RDBMS的ACID

    一.分布式领域CAP理论 CAP定理指在设计分布式系统时,一致性(Consistent).可用性(Availability).可靠性(分区容忍性Partition Tolerance)三个属性不可能同 ...

  6. vue 组件使用中的细节点

    1.is属性 有些 HTML 元素,诸如 <ul>.<ol>.<table> 和 <select>,对于哪些元素可以出现在其内部是有严格限制的.而有些元 ...

  7. Android应用开发细节点

    1.如果handler是在主线程声明,就属于主线程,handleMessage属于引用handler的那个线程:2.ByteArrayOutputStream/ByteArrayInputStream ...

  8. angular-route 和soket注意细节点

    route run 文件是第一个位置,之后才配置路由哪些,代码: angular.module('technodeApp',['ngRoute']).run(function($window,$roo ...

  9. Python语言发展的关键时间节点

    1989年:Python想法的产生 1991年:发布最早的Python可用版本 2000年:发布Python2.0 2010年:发布Python2.x系列的最后一个版本,主版本号为2.7 2008年: ...

  10. vuejs使用组件的细节点

    is属性 <div id='root'> <table> <tbody> <row></row> <row></row&g ...

随机推荐

  1. java推送企业微信消息

    <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcl ...

  2. Ansible - [08] 模块应用

    firewalld 模块 使用firewalld模块可以配置防火墙策略 [root@control ~]# cat ~/ansible/firewall.yml --- - hosts: agent ...

  3. 非局域网远程访问MySQL

    使用内网穿透解决,市面上说道最多的是"花生壳" 主要操作见这篇官方说明 但其中提到的什么花生棒(第二.三点)完全不用管,应该算是产品推销. 登录后选"新增内网映射&quo ...

  4. GIT 基础操作-初始化

    命令行说明 全局设置 git config --global user.name "" git config --global user.email "" 创建 ...

  5. MySQL 是否可以用 Docker 容器化?

    容器 容器是为了解决 "在切换运行环境时,如何保证软件能够正常运行",容器是轻量级应用代码包,它包含在任何环境中运行所需的所有元素的软件包.容器可以虚拟化操作系统,包含依赖项,例如 ...

  6. mac地址查询

    打开命令提示符窗口(cmd程序) 快捷键 win+r 打开运行窗口,输入 cmd 命令打开 命令提示符窗口 或者点击开始菜单,在搜索程序和文件输入框,输入 cmd(会找到进入dos命令的cmd程序) ...

  7. 查看Linux防火墙状态

    环境:VMware.CentOS8从centos7开始使用systemctl.firewalld来管理服务和程序,包括了service和chkconfig.防火墙状态:systemctl status ...

  8. BUUCTF---rsa2

    题目 N = 101991809777553253470276751399264740131157682329252673501792154507006158434432009141995367241 ...

  9. [每日算法] leetcode第1题:两数之和

    leetcode第1题入口 知识点 寻找循环体中目标值之间的关系来减少循环层数 (利用关系建立查找对方的数据结构来空间换时间) 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请 ...

  10. 用 PHP 封装的发送邮件类

    点击查看代码 <?php class MailSender { // 发件人邮箱地址 private $fromEmail; // 发件人名称 private $fromName; // 收件人 ...