CAP定理整理_craig定理

CAP定理整理_craig定理CAP定理是分布式系统设计中最基础、最关键的理论,CAP定理又称CAP原则,指的是在一个分布式系统中,Consistency(一致性)、Availability(可用性)、Partitiontolerance(分区容错性),最多只能同时三个特性中的两个,三者不可兼得CAP的定义Consistency(一致性):“allnodesseethesamedataatthe…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

CAP定理是分布式系统设计中最基础、最关键的理论,CAP定理又称CAP原则,指的是在一个分布式系统中,Consistency(一致性) Availability(可用性)Partition tolerance(分区容错性)最多只能同时三个特性中的两个,三者不可兼得

CAP的定义

Consistency (一致性):

“all nodes see the same data at the same time”,即更新操作成功并返回客户端后,所有节点在同一时间的数据完全一致,这就是分布式的一致性。一致性的问题在并发系统中不可避免,对于客户端来说,一致性指的是并发访问时更新过的数据如何获取的问题。从服务端来看,则是更新如何复制分布到整个系统,以保证数据最终一致。即每次读取要么获得最近写入的数据,要么获得一个错误

Availability (可用性):

可用性指“Reads and writes always succeed”,即服务一直可用,而且是正常响应时间。好的可用性主要是指系统能够很好的为用户服务,不出现用户操作失败或者访问超时等用户体验不好的情况。也就是每次请求都能获得一个响应,这个响应是非错误的,但是不确保返回的是最新写入的数据

Partition Tolerance (分区容错性):

即分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性或可用性的服务。

分区容错性要求能够使应用虽然是一个分布式系统,而看上去却好像是在一个可以运转正常的整体。比如现在的分布式系统中有某一个或者几个机器宕掉了,其他剩下的机器还能够正常运转满足系统需求,对于用户而言并没有什么体验上的影响。

取舍策略

CAP三个特性只能满足其中两个,那么取舍的策略就共有三种:

CA without P:如果不要求P(不允许分区),则C(强一致性)和A(可用性)是可以保证的。但放弃P的同时也就意味着放弃了系统的扩展性,也就是分布式节点受限,没办法部署子节点,这是违背分布式系统设计的初衷的。比如两阶段提交(2PC)

CP without A:如果不要求A(可用),相当于每个请求都需要在服务器之间保持强一致,而P(分区)会导致同步时间无限延长(也就是等待数据同步完才能正常访问服务),一旦发生网络故障或者消息丢失等情况,就要牺牲用户的体验,等待所有数据全部一致了之后再让用户访问系统。注意,CP关注的是系统中大多数人的一致性协议,比如Paxos 算法 (Quorum 类的算法)。设计成CP的系统其实不少,最典型的就是分布式数据库,如Redis、HBase等。对于这些分布式数据库来说,数据的一致性是最基本的要求,因为如果连这个标准都达不到,那么直接采用关系型数据库就好,没必要再浪费资源来部署分布式数据库。eg. Zookeeper

 AP without C:要高可用并允许分区,则需放弃一致性。一旦分区发生,节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。典型的应用就如某米的抢购手机场景,可能前几秒你浏览商品的时候页面提示是有库存的,当你选择完商品准备下单的时候,系统提示你下单失败,商品已售完。这其实就是先在 A(可用性)方面保证系统可以正常的服务,然后在数据的一致性方面做了些牺牲,虽然多少会影响一些用户体验,但也不至于造成用户购物流程的严重阻塞。eg. Eureka

作为服务发现产品,可用性优先级较高,一致性的特点则不重要,哪怕返回错误的数据,也比不返回结果要好一些。

服务列表变更Zookeeper服务端会有通知,Eureka则通过长轮询来实现,将来会实现watch机制。

我司使用了Zookeeper作为服务注册发现中间件,但是如上文所述,Zookeeper是CP系统,无法保证分布式下的可用性,需要使用AP系统。因此,公司大佬们实现AP系统服务注册发现,保证了数据的最终一致性。根据 Netflix Eureka 研发并优化的golang版本服务注册发现系统Discovery,与caster平台进行结合,基于k8s pod(k8s项目中的原子调度单位)实现滚动发布、蓝绿发布等,客户端使用HTTP协议与注册中心交互。 网络闪断时服务可开启自我保护,保证健康的服务可用。由于公司各部门开发语言不一致,有golang、java、python、php、C++等,再实现各个语言的sdk,基于http协议保证交互简易。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226838.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android 从零开始(一)[通俗易懂]

    Android 从零开始(一)[通俗易懂]Activity在我以网页web角度来认为的:Activity就是界面Layout就是html布局java就是js进行各种dom数据操作style就是cssAndroidManifest.xml-清单文件也可以简称为「manifest文件」。清单文件非常重要,它告诉系统我们的app有哪些activity,用到了什么权限等等信息。如果要新建activity,需要在清单中注册。<applicationandroid:allowBackup=”true” and

    2022年6月16日
    26
  • PotPlayer 64 bit快捷键大全

    PotPlayer 64 bit快捷键大全PotPlayer64bit快捷键大全前言-`д´-最近用PotPlayer64bit,在不知道的情况下视频翻转一下或者各种奇葩样子,总归一句话,弄不好了(눈_눈)。今天有时间总结一下(¬、¬)。  下载安装ヽ(o・་།・o)ノPotPlayer中文网PotPlayer官网ᕦ(・ㅂ・)ᕤ 快捷键方法一????安装完之后,右键–>关于–>有没有看到快捷键列表,就是那个????方法二????看下面看下面,没错,又是它

    2022年5月21日
    123
  • C语言实现读取文件的简单代码「建议收藏」

    C语言实现读取文件的简单代码「建议收藏」一、写文件#include<stdio.h>#include<stdlib.h>#include<string.h>#include<errno.h>intmain(){ printf(“File:%s\n”,__FILE__); printf(“Date:%s\n”,__DATE__); printf(“…

    2022年5月20日
    218
  • linux查看nfs端口命令,LinuxNFS端口命令是什么? 爱问知识人

    linux查看nfs端口命令,LinuxNFS端口命令是什么? 爱问知识人在Linux系统中,我们也会常遇到NFS的设置。针对这方面,我们这次主要讲解一下LinuxNFS的端口配置。看看如何设置可以调节好防火墙和端口的设置。#LinuxNFS服务固定端口及防火墙配置#1。在LINUX上正常安装NFS服务2。修改/etc/service,添加以下内容(端口号必须在1024以下,且未被占用)#Localservicesmountd1011/tcp#rpc。mount…

    2022年6月27日
    50
  • ORACLE备份恢复

    ORACLE备份恢复目录一、关于备份与恢复 二、逻辑备份(expdp和impdp) 三、物理备份 四、数据库日常备份计划及脚本参考一、关于备份与恢复1、备份定义备份就是把数据库复制到转储设备的过程。其中,转储设备是指用于放置数据库副本的磁带或磁盘。通常也将存放于转储设备中的数据库的副本称为原数据库的备份或转储。备份是一份数据副本2、备份分类从物理与逻辑的角度来分类:从物理与逻辑的,备份可以分为物理备份和逻辑备份。物理备份:对数据库操作系统的物理文件(数据文件,控制文件和日志文件)的备份。物…

    2022年7月17日
    21
  • ByteBuf用法

    ByteBuf用法JDKNIO之ByteBuffer的局限性如下:(1)长度固定,一旦分配完成,它的容量将不能动态扩展和收缩,而需要编码的POJO对象大雨ByteBuffer的容量时,会发生索引越界异常;(2)只有一个标识位置的指针position,读写的是偶需要搜公条用flip()和rewind()等,使用着必须小心的处理这些API,否则很容易导致程序越界异常;(3)ByteBuffer的API功能有限,…

    2022年9月19日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号