在做分布式系统开发时,经常会或多或少的听到CAP理论、或者是处理节点间数据一致性的问题。
CAP理论很简单,但却是很多软件设计的宏观指导,因此也有人将之称为架构师必须掌握的理论之一。
鉴于理论的东西相对来说比较抽象而且繁琐,因此我们先举个例子:
有一天你打王者荣耀连跪,于是找了一个大神鲁班,带你起飞:

于是就发生了下边的对话
(1)
射手鲁班:救救我,谢谢

辅助蔡文姬:收到
(2)
辅助蔡文姬:我来抓人了

射手鲁班:收到

如果一切良好,那么一切都OK

但是假若这时候YY语音突然挂掉了
(1)射手鲁班:救救我,谢谢

蔡文姬,没有响应

(2)辅助蔡文姬:我来抓人了

射手鲁班,没有响应

那么接下来有两种策略:
1、 暂时先不管YY语音的问题,继续打好游戏。
2、先不打游戏了,切屏打电话给对方,看下是不是发生了什么状况

是的,这涉及到所谓的CAP理论了,
也就是在分布式场景下,如果不同节点之间的通信出现了问题,那么不同节点的响应策略应该是什么样的。是该暂停响应,等待连接恢复,还是应该坚持响应,忽略数据的不一致性。
我们先来看下计算机领域中,CAP的专业解释:
一致性 Consistency:在分布式系统中,所有的数据备份,在任意时刻都要求一致;
可用性 Availability:对于分布式系统中的节点,在任意时候都可以正常的进行读写响应,并且不超时;
分区容错性 Partition tolerance:当节点之间的通信出现(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )故障时,整个分布式系统仍然可以运行起来,不至于直接崩溃掉;
P是背景,也就是在分布式系统下,如果节点之间的通信出现了问题,那么整个系统仍然在运行,等待网络恢复后,整个系统仍然可以正常操作。

经过理论以及实际的推演,我们发现在P的背景下,AC不可以共存。
也就是你无法做到既保证了节点的可用性,还保证了一致性。
专业的推演证明,这里就不说了,笔者自己的理解是这样的:
当节点之间的网络崩溃时,节点如果想要能够支持可用性,势必会造成数据的修改,从而造成数据的不一致,而网络又崩溃掉,因此没有办法进行节点间的数据同步。现在对于接下来的处理策略有两个选择:
(1)如果节点想要支持一致性呢,那么唯一的选择就是不能进行数据的写,这是因为节点之间无法进行数据的同步,因此只能放弃写操作,这就导致失去了高可用性。
(2)如果支持了写,那么就会出现节点间的数据不一致,并且由于网络问题,无法及时同步,这就失去了高一直性。

这套理论有什么用呢?
他可以明确指出,对于分布式系统来说,无法做出数据完美一直,而且有高可用的场景。架构设计必须要做出取舍。
1:遵从可用性,放弃高一致性
2:支持高一直性,放弃高可用性
具体应该如何选择,由业务来决定。如果你的系统支持短暂的业务停顿,但是系统不能出错,那么就要倾向于CP方案,如实时通话系统,财务交易系统。如果你的系统支持暂时的数据不一致性,但是一定要保证高可用性,如直播点赞,评论。那么就要倾向于AP方案。无所谓哪种方案更优秀,而是需要由业务来驱动技术的选型。
很多人说,不是CAP,三者取其二么?为什么你这里只有CP,和AP?
这两种理解其实都可以,但是(注意,要画重点了)
P所代表的是分区容忍性,是指分布式场景下,对于网络通信问题下仍然可用,这个是前提。
CP和AP是基于这个前提讨论的两种方案。如果划掉P,取AC,也就是单机场景下的一致性和可用性(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )问题,这就失去了讨论的意义。这好比在中学物理中R=U/I ,电阻等于电压除以电流。但是你不能理解为电阻与电压成正比,与电流成反比,因为电阻只与材料和规格相关。你可以按照公式推算出数据,但是不代表是字面的含义。

另外需要注意的是,上述情况下,都是理论模型,其中忽略了数据一致性所需要的网络延迟。也就是说,在实际情况中,由于网络的延时问题,高效的CP系统非常难实现。同时又由于互联网产品中本身需要的快速响应,所以在实际的开发中,往往AP模式的设计,相对来说占比会更大一点。那么如何规避掉一致性的影响呢?
这里提供两个思路
1、 数据的最终一致性,出现一致性问题没关系,只要不影响到核心的数据计算,是可以接受的。只要最终的数据能够保证一致性,满足幂等性即可。
2、 缩短数据一致性恢复的时间,也就是如果出现数据不一致的问题,系统可以想办法缩短恢复数据的耗时,如果当请求再次进来时,如果数据已经恢复完成,那么对于外界来说,就不会感知到此次的不一致。

看起来很唬人,然而却简单实用的CAP理论的更多相关文章

  1. 这两天老是有兄弟问到Vue的登陆和注册,登陆成功留在首页,没有登录回到登录页面,现在我用最简单实用的方法实现(两分钟技就看懂)

    其实登录注册,并且登录一次保持登录的状态,是每个项目都需要实现的功能. 网上也有很多的方法,不过,不是通俗易懂,在这里说一下我自己的方法,非常简单实用核心就是用localStorage存.取数据,这样 ...

  2. js jsp 时间 日期 控件 插件 简单 实用

    js时间控件一般都是找网上的用,这东西平常很少涉及到,一用到找起来却烦死人,不是没用就是太复杂,今天向大家推荐一个简单实用的控件,该控件在不断更新,而且有专门的网站对它进行维护,所以值得一看. 先说它 ...

  3. 基于Jquery 简单实用的弹出提示框

    基于Jquery 简单实用的弹出提示框 引言: 原生的 alert 样子看起来很粗暴,网上也有一大堆相关的插件,但是基本上都是大而全,仅仅几句话可以实现的东西,可能要引入好几十k的文件,所以话了点时间 ...

  4. C#反射实现 C# 反射 判断类的延伸类型 使用代码生成工具Database2Sharp快速生成工作流模块控制器和视图代码 C# ADO.NET的SqlDataReader对象,判断是否包含指定字段 页面中添加锚点的几种方式 .net 简单实用Log4net(多个日志配置文件) C# 常用小点

    C#反射实现   一.反射概念: 1.概念: 反射,通俗的讲就是我们在只知道一个对象的内部而不了解内部结构的情况下,通过反射这个技术可以使我们明确这个对象的内部实现. 在.NET中,反射是重要的机制, ...

  5. .NET 跨平台RPC框架DotNettyRPC Web后台快速开发框架(.NET Core) EasyWcf------无需配置,无需引用,动态绑定,轻松使用 C# .NET 0配置使用Wcf(半成品) C# .NET Socket 简单实用框架 C# .NET 0命令行安装Windows服务程序

    .NET 跨平台RPC框架DotNettyRPC   DotNettyRPC 1.简介 DotNettyRPC是一个基于DotNetty的跨平台RPC框架,支持.NET45以及.NET Standar ...

  6. 经验分享:10个简单实用的 jQuery 代码片段

    尽管各种 JavaScirpt 框架和库层出不穷,jQuery 仍然是 Web 前端开发中最常用的工具库.今天,向大家分享我觉得在网站开发中10个简单实用的 jQuery 代码片段. 您可能感兴趣的相 ...

  7. x01.os.15: 看上去很美

    张碧晨在韩国学的不是技巧,而是基本功:气息!声音由气息托着,似真声而不是真声,似假声又不是假声,所以才能在动听的地方唱得更动听.编程也是一样,基本功很重要:内存!所谓的黑客高手,攻击的一大手段,便是利 ...

  8. 简单实用的Windows命令(二)

    昨天简单的记录了几个非常简单实用的Windows命令,不过我又想起来还有两个我在实际的工作中也是经常用到的命令——PING和IPCONFIG,不过我在工作中的使用都是非常简单的,用PING命令检测对应 ...

  9. 看上去很美 国内CDN现状与美国对比

    CDN的理想与现实 多年以前,当<Kingdom of Heaven>这部史诗电影发行的时候,中国的影迷使用电驴和BT来寻找种子,而那个时候,高清也才刚刚进入电影领域,我的同事不惜用自家的 ...

随机推荐

  1. day100:MoFang:用户模型类的创建&Marshmallow模块&使用基本构造器Schema完成数据的序列化转换和反序列化转换

    目录 1.用户模型的创建 2.Marshmallow模块 3.MarshMallow基本构造器:Schema 1.基于Schema完成数据序列化转换 2.基于Schema完成数据反序列化转换 3.反序 ...

  2. LeetCode 024 Swap Nodes in Pairs

    题目描述:Swap Nodes in Pairs Given a linked list, swap every two adjacent nodes and return its head. For ...

  3. Spring Boot 实现看门狗功能 (调用 Shell 脚本)

    需要实现看门狗功能,定时检测另外一个程序是否在运行,使用 crontab 仅可以实现检测程序是否正在运行,无法做到扩展,如:手动重启.程序升级(如果只需要实现自动升级功能可以使用 inotify)等功 ...

  4. Spring Boot 统一返回结果及异常处理

    在 Spring Boot 构建电商基础秒杀项目 (三) 通用的返回对象 & 异常处理 基础上优化.调整 一.通用类 1.1 通用的返回对象 public class CommonReturn ...

  5. 20190627_解决ADB的device offline问题的两种方法

    故障现象: error: device offline 故障解决: 第一种方法: C:\Users\WXY\Desktop\XY\adb>adb nodaemon server cannot b ...

  6. java并发编程实战《二》java内存模型

    Java解决可见性和有序性问题:Java内存模型 什么是 Java 内存模型? Java 内存模型是个很复杂的规范,可以从不同的视角来解读,站在我们这些程序员的视角,本质上可以理解为, Java 内存 ...

  7. PyQt(Python+Qt)学习随笔:QDockWidget停靠部件的allowedAreas属性

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 QDockWidget的allowedAreas属性用于控制停靠部件在 ...

  8. Python的富比较方法__lt__、__gt__之间的关联关系分析

    Python的富比较方法包括__lt__.__gt__分别表示:小于.大于,对应的操作运算符为:"<".">".那么是否象普通数字运算一样,这两个方 ...

  9. PyQt(Python+Qt)学习随笔:QTabWidget选项卡部件当前项类属性currentIndex、currentTabText、currentTabName、currentTabIcon介绍

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTabWidget的当前项类属性为用于访问当前操作的选项卡,包括如下属性: 1. currentI ...

  10. day010|python之装饰器

    装饰器02 目录 装饰器02 1 装饰器的语法糖 1.1 定义 1.2 基本使用 2 有参装饰器 2.1 基本用法 2.2 示例 3叠加多个装饰器 3.1 基本用法 3.2 示例 4 wraps装饰器 ...