程序员修神之路--晦涩难懂的CAP,是否完全正确?

微信搜一搜

架构师修行之路

菜菜哥,帮忙解决一个问题

是不是面试又被虐了?

是的呢,这次面试官问我什么是CAP?

这个可就说来话长了......

01

PART

CAP

说到CAP,首先不能不说分布式系统,前面几篇也说过,分布式系统的出现,很大的一个原因是要解决单机系统的瓶颈问题,但是工作模式上还需要保证系统的可用性,一致性,性能等。一个分布式系统,网络不可靠的特性必然存在,这就导致了分布式系统比单机系统要面对更多的不确定因素的挑战。

CAP是针对分布式系统提出的一个重要理论,在很多开发者眼里被视为金律。CAP理论是对分布式系统特点的一个高度抽象,也是我们设计一个分布式系统很好的参考框架。在CAP理论提出初期,有很多人提出各种质疑,后来CAP之父又再次给CAP理论做出了重要修正。

很多架构师在设计系统的时候都以CAP理论为重要参考依据,其中CAP不可能三角是最重要的指导思想。CAP把一个分布式系统抽象为三个固有属性:

1. 一致性(Consistency):客户端无论访问系统的哪个节点,要么读到的数据都是最新的,要么读取失败。这本质上是说分布式系统的所有节点上的数据都是实时同步的,一致性强调的是数据正确性。

2. 可用性(Availability):当系统内任意一个节点发生了故障,非故障的节点仍然能响应客户端的请求,无论这个响应返回的是最新数据还是旧数据。这个特性可以看做是对客户端的一个保证:无论何时,我都能给你响应。

3. 分区容错性(Partition Tolerance):即使系统内部某个节点有消息丢失或者高延迟,系统仍然能持续提供服务。这个指标强调的是对分布式系统的容错能力。

分布式系统是由通过网络通信的多个节点组成,因为系统需要持续对外提供服务,所以分区容错性(P)是分布式系统必须要保证的。三角理论这个时候就尴尬到只需要从一致性和可用性这两个指标中选择一个,所以有人根据这个特点提出:

基于CAP理论的分布式系统,分区容错是固有而且必须要保证的一个指标,设计分布式系统要根据业务的场景来选择一致性还是可用性。

02

PART

使用CAP理论设计系统

当我们在设计一个分布式系统的时候,由于分区容错性必须要保证,所以就演化成了是选择AP,还是选择CP指标。

当我们选择了CP(一致性)的时候,客户端的每次请求一定会读取到最新的数据,但是因为消息丢失,节点通信高延迟等原因,被读取的节点中的数据不一定是最新数据,所以为了保证一致性,这个时候返回给客户端的是出错信息,换句话说,这个节点在这个时候是不可用的。

当我们选择了AP(可用性)的时候,为了始终响应客户端的请求,哪怕节点上的信息不是最新数据也要给客户端响应,这个时候客户端得到的可能是过时的数据。

真实的线上系统环境中,其实还存在另外一个场景:随着节点的不断增加,严格的一致性会导致系统的响应时间变慢,系统资源消耗的增加,这个时候为了维护强一致性的成本可能要超出我们的预期,在这种情况下,我们就只剩下了一种选择:更多的选择可用性,放弃强一致性,采用最终一致性。

退一步说,在分布式系统节点不是很多的情况下,CAP三个指标在一定程度上是可以同时能够保证的。但是针对分布式数据库事务领域,后来的专家已经证实并不适用于CAP。

举一个很简单的例子:如果要设计一套分布式的日志收集系统改如何选择呢?俗话说脱离业务的架构就是耍流氓,具体的系统设计还要看每个业务的场景。日志收集的分布式系统很典型的一个特点是:读少写多,数据重要性级别低,数据量大,可以容忍部分数据丢失。这样的场景下,我们可以优先选择AP,能持续的提供服务比数据一致性要重要很多。

再举一个简单例子:每个公司有自己的配置中心,配置中心中可能会存储分布式系统重要的配置信息,比如:每个节点的IP和端口信息等。在这样的系统中,客户端每次读取配置中心的信息要求必须为最新数据,如果不是最新数据会发生业务错误信息,比如一个分布式系统中A节点挂掉了,配置中心中所有的节点数据必须要保证一致(删除A节点信息),不然的话,客户端还能读到A节点的信息,然后去访问A节点会发生业务异常的。

03

PART

BASE理论

由于CAP原则在只能在AP和CP之间二选一,而且在选择强一致性的同时会大大牺牲性能,这对于并发和响应时间都有要求的系统都是难以接受的。于是eBay公司尝试选择了不同的方案,提出了一套名为BASE的理论。

BASE理论基本思想是牺牲了数据一致性来满足系统的可用性,在系统发生故障或者部分数据不一致的时候,扔能提供系统“主要可用”。

BASE:全称:Basically Available(基本可用),Soft state(软状态),和 Eventually consistent(最终一致性)三个短语的缩写

BASE理论是对CAP理论的一个延伸,或者说是对AP模型的一个延伸,它是对互联网大规模分布式系统的一个总结,强调的是可用性。

Basically Available(基本可用)

基本可用不同的系统有不同的解释,但是总体思想是保证系统大部分可用。

在一个分片的分布式存储系统中,假设有10个节点来存储数据,假设其中两个节点发生故障,那么其他8个节点仍然能提供服务,既:系统的80%仍然可用。

我们平时用的流量削峰策略,其实本质上也是要保证系统的主要可用。服务降级,服务熔断也是通过牺牲一部分系统的可用性来保证核心功能可用。

以上所说都说明了一个事实:基本可用本质上是一种妥协,在节点出现故障的时候通过牺牲非核心功能的可用性,来保证核心功能的可用性。

Soft state(软状态)

对于服务端的系统来说,每个节点或者服务都可以设计为有状态(stateful)和无状态(stateless),这在根本上决定了一个分布式系统是否具有良好的扩展性,故障恢复等高级特性。对于完全无状态的服务来说,具有更好的水平扩展性,而对于有状态的服务来说,如果要实现水平扩展,可能涉及到状态的迁移等过程,比较复杂。

基于有状态和无状态的思想,BASE理论提出一个介于中间的状态:soft state:服务端会维护数据的状态,但是有一个期限,过了这个期限,服务端将会丢弃这些状态信息,恢复正常的状态。

Eventually consistent(最终一致性)

最终一致性是指系统在经过一段时间内,每个节点的数据会达到一个一致的状态,换句话说,它是必须经过一段时间才能达到强一致性的过程。

由于强一致性的缺陷,现在几乎所有的互联网系统都是基于最终一致性来设计架构,当然如果最终一致性不满足业务场景的情况下,才会使用牺牲性能和可用性来采用强一致性。比如在支付的场景中,必须要采用强一致性来设计系统,不然这个锅是程序员背不起的。

至于如何实现最终一致性,有很多的解决方案,目前最常用的是利用MQ消息来实现,前提是你的MQ需要保证不丢失消息。举个很简单的例子:一个典型的电商场景,商品管理系统和订单系统是两个物理上隔离的两个系统,可以看做是两个微服务,当一个订单支付成功之后,商品管理系统需要把对应的商品减少库存,这个过程可以采用最终一致性来设计。当订单支付成功,发一个mq消息,当商品管理系统接收到这个消息,会把对应商品的库存扣掉。

04

PART

写在最后

CAP理论是分布式设计中一个重要的参考指标,但是这个理论并非放之四海而皆准的思想,它的适用场景仅仅在非数据库系统的原子读写。在互联网高速发展的今天,分布式系统早已不是之前的简单系统了,架构师在设计系统中还需要考虑安全性,扩展性,自动化等诸多因素,所以现在做程序员多累呀!!

BASE理论绕过了难以实现的分布式强一致性,采用一种权衡的策略来达到业务要求。BASE理论主要针对数据分片场景,让不同的数据分布在不同的节点,以提升系统的可用性。

END

●程序员修神之路--为什么我会了SOA,你们还要逼我学微服务?

●程序员过关斩将--数据库的乐观锁和悲观锁并非真实的锁

●程序员修神之路--设计一套RPC框架并非易事

●程序员过关斩将--要想获取我的用户信息,就得按照规矩来

●程序员过关斩将--更加优雅的Token认证方式JWT

●程序员过关斩将--cookie和session的关系其实很简单

●程序员修神之路--用NOSql给高并发系统加速

●程序员修神之路--高并发系统设计负载均衡架构

●程序员过关斩将--你为什么还在用存储过程?

●程序员修神之路--问世间异步为何物?

●程序员修神之路--提高网站的吞吐

长按添加菜菜好友

关注后回复:“大礼包”和“福利”,领取惊喜

点分享

点点赞

点在看

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

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

相关文章

[MyBatisPlus]雪花算法

雪花算法 背景 需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量。 数据库的扩展方式主要包括:业务分库、主从复制,数据库分表。 数据库分表 将不同业务数据分散存储到不同的数据库服务器,能够支撑…

如何隐藏运行 winform 程序?

群里有个同学问了问题 如何隐藏运行 winform 程序?,提起了我的兴趣,玩玩呗?那就玩玩吧!第一版 将一个 winform 程序隐藏执行,隐藏执行的方式有很多种,第一个 demo 就用最简单的方式,…

[MyBatisPlus]常用注解_@TableName_@TableId_@TableField_@TableLogic通过全局配置配置主键生成策略

常用注解 TableName 设置实体类所对应的表名 如果全部表都有某个前缀,难道我们要通过一个一个加注解的方式来解决实体类对应表名问题吗? 我们可以通过配置文件来解决这个问题: TableId 将属性所对应的字段指定为主键 TableId的value属性 TableId的ty…

最小堆和最大堆的建立以及基本操作

前言: 堆的特性:用数组表示的完全二叉树。有序性:任一结点的关键字是其子树所有结点的最大值 (最小值) 堆的本质:就是一颗 完全二叉树 堆的数据存储: 用的是 数组 建堆时主要的操作:就是调整 对数组的元素…

字符串是单一字符的无序组合吗_Python学习笔记(八)组合数据类型

Python语言中最常用的组合数据类型有3大类, 分别是集合类型、序列类型和映射类型。集合类型是一个具体的数据类型名称,而序列类型和映射类型是一类数据类型的总称。集合类型是一个元素集合,元素之间无序,相同元素在 集合中唯一存在…

[MyBatisPlus]条件构造器wapper

wapper简介 QueryWrapper 组装查询条件 查询用户名包含a,年龄在20到30之间,邮箱信息不为null的用户信息 package com.xxxx.mybatisplus;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.xxxx.mybatisplus.mapper.Use…

推荐:适合小白入门的Asp.Net Core 开源学习手册

前言推荐一个入门级的.NET Core开源项目,非常适合新手入门学习.NET Core。开源地址:https://github.com/windsting/little-aspnetcore-book。手册在线下载地址:https://nbarbettini.gitbooks.io/little-asp-net-core-book/content/chapters/mvc-basics/c…

从当前元素继续寻找_云漫圈 | 寻找无序数组的第k大元素

戳蓝字“CSDN云计算”关注我们哦!作者:小灰来源:程序员小灰本期封面作者:泰勒太乐————— 第二天 —————题目是什么意思呢?比如给定的无序数组如下:如果 k6,也就是要寻找第6大的元素&a…

DFS和BFS总结和代码演示(详解)

1:BFS 广度优先搜索类似于树的层次遍历过程。它需要借助一个队列来实现。如图2-1-1所示,要想遍历从v0到v6的每一个顶点,我们可以设v0为第一层,v1、v2、v3为第二层,v4、v5为第三层,v6为第四层,再…

Kestrel的ListenAnyIP和ListenLocalhost的区别

问题在上篇文章,把AAStore.ProductCatalog.Api部署到docker中运行,输入地址访问报错如下图,说明外部无法访问这个url。(当然本地开发环境测试是可以访问的)。后来修改此处options.ListenLocalhost(8081)的代码改成opti…

[MyBatisPlus]Plus分页插件的配置和使用

Plus分页插件的配置和使用 配置类 package com.xxxx.mybatisplus.config;import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.Pagin…

控制是否展示_现场展示板管理不在于看,而在于管!

点击上方"五株科技",关注公众号,天天有精彩!一位日本专家根据研究数据宣称,如果中国的中小企业有效实行车间展示板管理,最大能够提升生产效率30%以上。通常被管理者小视的车间展示板,在专家眼中却…

龙芯完成.NET移植稳步推进生态建设

不久前,龙芯团队完成了.Net Core 3.1在龙芯上的移植。早在1年前,一位网友就告知,希望.Net能够移植到龙芯平台,因为一些政务应用场景有这方面的需求。只不过了一年,这就问题就被龙芯团队解决了。龙芯团队之所以移植.Net…

[MyBatisPlus]乐观锁和悲观锁

乐观锁和悲观锁 场景 一件商品,成本价是80元,售价是100元。老板先是通知小李,说你去把商品价格增加50元。小李正在玩游戏,耽搁了一个小时。正好一个小时后,老板觉得商品价格增加到150元,价格太高&#xf…

7月30日 举办专注于微服务的.NET Conf Focus

2020 年 7 月 30 日, 由.NET基金会和微软 将举办一个在线和为期一天的活动,包括 微软 .NET 团队的演讲者以及社区的演讲者。本次在线大会 专注.NET框架构建微服务,演讲者分享构建和部署云原生应用程序的最佳实践、模式、提示和技巧。有关更多信息和随时了…

7-8 哈利·波特的考试 (25 分)(详解+思路分析)真香啊

一:题目: 哈利波特要考试了,他需要你的帮助。这门课学的是用魔咒将一种动物变成另一种动物的本事。例如将猫变成老鼠的魔咒是haha,将老鼠变成鱼的魔咒是hehe等等。反方向变化的魔咒就是简单地将原来的魔咒倒过来念,例…

ABPHelper.CLI及其依赖项简单介绍

图片gif无法查看,请查看原文至博客园查看详情。目录目录ABPHelper.CLIScriban通过Microsoft.Extensions.FileProviders.Embedded获取嵌入资源通过静态方法获取文件内容使用Microsoft.Extensions.FileProviders.Physical获取文件内容Microsoft.CodeAnalysis.CSharpHu…

[RabbitMQ]整合SpringBoot

整合SpringBoot 创建项目 引入依赖 <dependencies><!--RabbitMQ 依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><…

mysql 固定符号分列显示_MySql中指定符号分割并分行展示

1.涉及到的函数三个&#xff1a;1.1 REPLACE(value,str1,str2)用法规则&#xff1a;使用str2替换掉value中的所有的str1;SELECT REPLACE(我来了,来,走)执行结果如下&#xff1a;1.2 LENGTH(str)用法规则&#xff1a;获取字符串的长度&#xff0c;使用 uft8(UNICODE 的一种变长字…

C++中 Map的了解与基本用法(代码演示+自我总结+map中一对多的用法)

C中 map的了解与基本用法&#xff08;代码演示&#xff09; 一&#xff1a;map的基本认识 Map是STL的一个关联容器&#xff0c;它提供一对一&#xff08;其中第一个可以称为关键字&#xff0c;每个关键字只能在map中出现一次&#xff0c;第二个可能称为该关键字的值&#xff…