看起来很唬人,然而却简单实用的CAP理论
在做分布式系统开发时,经常会或多或少的听到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理论的更多相关文章
- 这两天老是有兄弟问到Vue的登陆和注册,登陆成功留在首页,没有登录回到登录页面,现在我用最简单实用的方法实现(两分钟技就看懂)
其实登录注册,并且登录一次保持登录的状态,是每个项目都需要实现的功能. 网上也有很多的方法,不过,不是通俗易懂,在这里说一下我自己的方法,非常简单实用核心就是用localStorage存.取数据,这样 ...
- js jsp 时间 日期 控件 插件 简单 实用
js时间控件一般都是找网上的用,这东西平常很少涉及到,一用到找起来却烦死人,不是没用就是太复杂,今天向大家推荐一个简单实用的控件,该控件在不断更新,而且有专门的网站对它进行维护,所以值得一看. 先说它 ...
- 基于Jquery 简单实用的弹出提示框
基于Jquery 简单实用的弹出提示框 引言: 原生的 alert 样子看起来很粗暴,网上也有一大堆相关的插件,但是基本上都是大而全,仅仅几句话可以实现的东西,可能要引入好几十k的文件,所以话了点时间 ...
- C#反射实现 C# 反射 判断类的延伸类型 使用代码生成工具Database2Sharp快速生成工作流模块控制器和视图代码 C# ADO.NET的SqlDataReader对象,判断是否包含指定字段 页面中添加锚点的几种方式 .net 简单实用Log4net(多个日志配置文件) C# 常用小点
C#反射实现 一.反射概念: 1.概念: 反射,通俗的讲就是我们在只知道一个对象的内部而不了解内部结构的情况下,通过反射这个技术可以使我们明确这个对象的内部实现. 在.NET中,反射是重要的机制, ...
- .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 ...
- 经验分享:10个简单实用的 jQuery 代码片段
尽管各种 JavaScirpt 框架和库层出不穷,jQuery 仍然是 Web 前端开发中最常用的工具库.今天,向大家分享我觉得在网站开发中10个简单实用的 jQuery 代码片段. 您可能感兴趣的相 ...
- x01.os.15: 看上去很美
张碧晨在韩国学的不是技巧,而是基本功:气息!声音由气息托着,似真声而不是真声,似假声又不是假声,所以才能在动听的地方唱得更动听.编程也是一样,基本功很重要:内存!所谓的黑客高手,攻击的一大手段,便是利 ...
- 简单实用的Windows命令(二)
昨天简单的记录了几个非常简单实用的Windows命令,不过我又想起来还有两个我在实际的工作中也是经常用到的命令——PING和IPCONFIG,不过我在工作中的使用都是非常简单的,用PING命令检测对应 ...
- 看上去很美 国内CDN现状与美国对比
CDN的理想与现实 多年以前,当<Kingdom of Heaven>这部史诗电影发行的时候,中国的影迷使用电驴和BT来寻找种子,而那个时候,高清也才刚刚进入电影领域,我的同事不惜用自家的 ...
随机推荐
- windowsAPI函数操作注册表实现软件开机自启
注册表的结构 注册表是一个数据库,它的结构同逻辑磁盘类似.注册表包含键(Key),它类似磁盘中的目录,注册表还包含键值(Value),它类似磁盘中的文件.一个键可以包含多个子健和键值,其中键值用于存储 ...
- python应用(5):变量类型与数据结构
如前所说,写程序如同给算法写壳,而算法就是流程,所以流程是程序的主角(但这个流程不一定要你来设计).在程序中,为了配合流程(算法)的实现,除了顺序.分支与循环语句的使用,还要借助"变量&qu ...
- python核心高级学习总结4-------python实现进程通信
Queue的使用 Queue在数据结构中也接触过,在操作系统里面叫消息队列. 使用示例 # coding=utf-8 from multiprocessing import Queue q = Que ...
- 第9.9节 Python文件随机读写定位操作方法seek
类似于C语言,Python也提供了文件位置定位的操作方法seek. 一. 语法 seek(offset, whence=SEEK_SET) 语法释义: 1)offset :将文件当前操作位置移动偏移量 ...
- 第9.1节 Python的文件打开函数open简介
一.语法简介 函数基本使用语法:open(文件名,文件打开模式='rt') 其中: 1.文件名为可带路径的文件名,注意windows下路径的反斜杠会被作为转义符处理,因此可以采用前面再加反斜杠或使用原 ...
- Get请求Test
一.新建测试套 作为管理接口,可按功能分类,也可按业务逻辑分类,根目录下最多一级子目录.运行接口时,可按测试套为单位,整体运行. 二.选择请求类型,输入接口地址 根据接口文档中提供的接口请求类型及地址 ...
- PHP代码审计分段讲解(13)
代码审计分段讲解之29题,代码如下: <?php require("config.php"); $table = $_GET['table']?$_GET['table']: ...
- PHP代码审计分段讲解(11)
后面的题目相对于之前的题目难度稍微提升了一些,所以对每道题进行单独的分析 27题 <?php if(!$_GET['id']) { header('Location: index.php?id= ...
- linux c++ 内存泄漏检测工具:AddressSanitizer(ASan)
1.介绍 AddressSanitizer(ASan),该工具为gcc自带,4.8以上版本均可以使用. 2.使用 编译的方式很简单,只需要添加 -fsanitize=address -g 即可,如 g ...
- 题解-CTS2019 珍珠
题面 CTS2019 珍珠 有 \(n\) 个在 \([1,d]\) 内的整数,求使可以拿出 \(2m\) 个整数凑成 \(m\) 个相等的整数对的方案数. 数据范围:\(0\le m\le 10^9 ...