当前位置: 首页 > news >正文

CAP原则

CAP原则又称CAP定理,指的是在一个分布式系统中,存在Consistency(一致性)、Availability(可用性)、Partition tolerance(分区容错性),三者不可同时保证,最多只能保证其中的两者。

一致性(C):在分布式系统中的所有数据备份,在同一时刻都是同样的值(所有的节点无论何时访问都能拿到最新的值)

可用性(A):系统中非故障节点收到的每个请求都必须得到响应(比如我们之前使用的服务降级和熔断,其实就是一种维持可用性的措施,虽然服务返回的是没有什么意义的数据,但是不至于用户的请求会被服务器忽略)

分区容错性(P):一个分布式系统里面,节点之间组成的网络本来应该是连通的,然而可能因为一些故障(比如网络丢包等,这是很难避免的),使得有些节点之间不连通了,整个网络就分成了几块区域,数据就散布在了这些不连通的区域中(这样就可能出现某些被分区节点存放的数据访问失败,我们需要来容忍这些不可靠的情况)

总的来说,数据存放的节点数越多,分区容忍性就越高,但是要复制更新的次数就越多,一致性就越难保证。同时为了保证一致性,更新所有节点数据所需要的时间就越长,那么可用性就会降低。

所以说,只能存在以下三种方案:

AC 可用性+一致性

要同时保证可用性和一致性,代表着某个节点数据更新之后,需要立即将结果通知给其他节点,并且要尽可能的快,这样才能及时响应保证可用性,这就对网络的稳定性要求非常高,但是实际情况下,网络很容易出现丢包等情况,并不是一个可靠的传输,如果需要避免这种问题,就只能将节点全部放在一起,但是这显然违背了分布式系统的概念,所以对于我们的分布式系统来说,很难接受。

CP 一致性+分区容错性

为了保证一致性,那么就得将某个节点的最新数据发送给其他节点,并且需要等到所有节点都得到数据才能进行响应,同时有了分区容错性,那么代表我们可以容忍网络的不可靠问题,所以就算网络出现卡顿,那么也必须等待所有节点完成数据同步,才能进行响应,因此就会导致服务在一段时间内完全失效,所以可用性是无法得到保证的。

AP 可用性+分区容错性

既然CP可能会导致一段时间内服务得不到任何响应,那么要保证可用性,就只能放弃节点之间数据的高度统一,也就是说可以在数据不统一的情况下,进行响应,因此就无法保证一致性了。虽然这样会导致拿不到最新的数据,但是只要数据同步操作在后台继续运行,一定能够在某一时刻完成所有节点数据的同步,那么就能实现最终一致性,所以AP实际上是最能接受的一种方案。

比如我们实现的Eureka集群,它使用的就是AP方案,Eureka各个节点都是平等的,少数节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而Eureka客户端在向某个Eureka服务端注册时如果发现连接失败,则会自动切换至其他节点。只要有一台Eureka服务器正常运行,那么就能保证服务可用**(A),只不过查询到的信息可能不是最新的(C)**

http://www.lryc.cn/news/90941.html

相关文章:

  • 【PowerQuery】M语言的使用产品和使用场景
  • 【Linux】遇事不决,可先点灯,LED驱动的进化之路---1
  • hive任务reduce步骤卡在99%原因及解决
  • C++11 -- lambda表达式
  • 【开源项目】银行查询服务的设计和实现
  • Linux服务器禁止密码登录,设置秘钥登录
  • 第十八章 开发Productions - ObjectScript Productions - 通过引用或作为输出传递值
  • 【云原生|Kubernetes】07-Pod健康检查和服务可用性检查
  • jeecgboot使用的问题记录
  • 【C++】数组 - 一维数组,二维数组
  • 前端:使用rollup的简单记录
  • 基于flask的web应用开发——接受post请求
  • Linux源码包的安装与升级
  • 电子合同签署协议开源版系统开发
  • 【每日一题Day221】LC2455可被三整除的偶数的平均值 | 模拟
  • NCI架构-1
  • lambda使用场景
  • Python模拟Postgres数据库连接
  • (转载)基于粒子群算法的多目标搜索算法(matlab实现)
  • 皮卡丘存储型xss、DOM型xss、DOM型xss-x
  • ThreadLocal源码
  • Hive学习---3、DML(Data Manipulation Language)数据操作、查询
  • chatgpt赋能python:Python去除重复元素的几种方法
  • 2年测试我迷茫了,软件测试大佬都会哪些技能?我的测试进阶之路...
  • 21天学会C++:Day7----auto关键字
  • Vue3 + ElementPlus实战学习——模拟简单的联系人列表管理后台
  • 【Go语言从入门到实战】并发篇
  • img标签请求 添加自定义header(二)
  • Set和weakSet Map和WeakMap
  • Qt基础之三十六:异常处理