CAP定理

2.1 CAP 定理的由来与证明
CAP 定理是计算机科学界的“铁律”,最早由 Eric Brewer 提出,后来被正式证明:

分布式系统里,一致性(C)、可用性(A)、分区容错性(P),三选二 。
在这里插入图片描述

说白了就是:你想当个“全能选手”,但生理极限摆在那儿。

CAP 定理不是吓唬人,而是告诉你:

在网络抖动、节点挂掉的情况下,你必须选择牺牲一致性或可用性。

2.2 CAP 定理的三要素
一致性(Consistency,C):所有节点看到的数据必须是一样的。就像银行转账,一秒差错都可能让用户报警。但强一致性有个代价——效率低,用户得等。

可用性(Availability,A):系统能随时响应请求,哪怕返回的是不太准确的数据。比如双十一,你下单秒杀个商品,能买到就开心了,至于库存可能会稍微滞后。

分区容错性(Partition Tolerance,P):网络出问题时,系统还能继续提供服务。毕竟分布式系统里,网络断连是常态,你不可能让它一断网就宕机。

三者冲突的现实:

如果你既想数据毫无误差,又想系统随时响应,还想网络断了照样能跑,那结果只有一个:

系统超载爆炸。分布式系统的难题就在于此。

  1. CAP 定理的实践意义:强一致性和高并发的终极选择
    3.1 CP(强一致性) VS AP(高并发)
    CP(强一致性):
    比如银行系统,转账时你宁可多等几秒钟,也不能让账户余额出错。

这时候,系统会优先保障一致性,即便某些节点挂掉,整个服务变慢,也得保证数据“账账相符”。

AP(高并发):
像电商秒杀,用户需要的是“能买到就行”,至于库存数据稍微延迟,事后对账能补回来。这种场景更倾向于高可用性,牺牲一致性。

总结一句话:CP 保证严谨,AP 注重速度,最终的选择得看业务场景。

  1. 分布式中间件中的 CAP 定理实现
    在这里插入图片描述
    4.1 Redis Cluster 是 AP 型
    分区容错性(P):Redis 的分片存储机制,让数据分布在多个节点上,某些节点挂了系统也不会死。
    可用性(A):主从复制机制,切换节点几乎无感知。
    一致性(C):但主从同步可能有延迟,数据不一定完全一致。
    总结:Redis 不追求强一致性,它的目标是:快!快!快!

4.2 Zookeeper 是 CP 型
分区容错性(P):网络断连时,Zookeeper 保证“少数服从多数”,继续维护一致性。
一致性(C):ZAB 协议确保数据同步,适合分布式锁这种对一致性要求极高的场景。
可用性(A):但可用性差点意思,Leader 挂掉时会短暂不可用。
总结:Zookeeper 更适合用在需要“严防死守”的场景,比如分布式锁和服务注册。

4.3 MongoDB 属于 CP 型
MongoDB 的选主机制更关注一致性,而不是在网络分区时优先保持可用性。
适合:需要一致性的非关系型存储场景。
4.4 Cassandra 属于 AP 型
基于 Gossip 协议,Cassandra 牺牲一致性换来了超高的可用性和分区容错能力。
适合:大规模分布式写入,如日志和监控数据。
4.5 Eureka 属于 AP 型
作为微服务注册中心,Eureka 优先考虑高可用性。即使心跳超时,也会保持服务注册状态。
适合:高并发场景的服务发现。
4.6 Nacos 支持 AP + CP
Nacos 提供 AP 和 CP 模式切换:临时节点用 AP,永久节点用 CP。灵活应对各种场景。
总结一句话:分布式中间件的 CAP 策略就是“场景优先,问题靠边”。

  1. 总结:CAP 定理对架构设计的深远影响
    CAP 定理不是魔咒,而是底层逻辑。
    理解它的核心冲突,你才能在分布式系统里活得更明白。
    技术选型时先看业务场景:银行选 CP,电商秒杀选 AP。
    架构师的终极哲学:分布式系统里没有完美,只有最合适的权衡。
    总结:CAP 定理教会我们的,是如何用有限的资源,撑起分布式系统的无限可能。

参考链接:https://blog.csdn.net/liuguojiang1128/article/details/144332961

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

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

相关文章

【flutter】webview下载文件方法集锦

说明:android的webview是不支持下载的!!! 所以我们需要监听下载接口 然后手动执行下载操作,分为三种类型 直接打开浏览器下载(最简单),但是一些下载接口需要cookie信息时不能满足 …

Java版-图论-最短路-Floyd算法

实现描述 网络延迟时间示例 根据上面提示,可以计算出,最大有100个点,最大耗时为100*wi,即最大的耗时为10000,任何耗时计算出来超过这个值可以理解为不可达了;从而得出实现代码里面的: int maxTime 10005…

SQL注入基础入门篇 注入思路及常见的SQL注入类型总结

目录 前言一、了解mysql数据库1、了解sql增删改查2、了解sql查询 二、sql注入基础三、学习sql注入漏洞1、union注入1、判断数字型注入还是字符型型注入:2、判断闭合方式(字符型注入):3、判断回显位4、查询库名,表名&am…

基于Spring Boot库存管理系统

文末获取源码和万字论文,制作不易,感谢点赞支持。 基于Spring Boot库存管理系统 当下,如果还依然使用纸质文档来记录并且管理相关信息,可能会出现很多问题,比如原始文件的丢失,因为采用纸质文档&#xff0c…

JSSIP的使用及问题(webRTC,WebSockets)

简介 项目中有一个需要拨打电话的功能,要求实时的进行音频接听,并且可以在电话接听或者挂断等情况下做出相应的操作。jssip作为一个强大的实现实时通信的javascript库,这不门当户对了嘛。 jssip(官网: JsSIP - the J…

【Cadence32】PCB多层板电源、地平面层创建心得➕CM约束管理器Analyze分析显示设置➕“DP”报错DRC

【转载】Cadence Design Entry HDL 使用教程 【Cadence01】Cadence PCB Edit相对延迟与绝对延迟的显示问题 【Cadence02】Allegro引脚焊盘Pin设置为透明 【Cadence03】cadence不小心删掉钢网层怎么办? 【Cadence04】一般情况下Allegro PCB设计时的约束规则设置&a…

Java阶段三06

第3章-第6节 一、知识点 理解MVC三层模型、理解什么是SpringMVC、理解SpringMVC的工作流程、了解springMVC和Struts2的区别、学会使用SpringMVC封装不同请求、接收参数 二、目标 理解MVC三层模型 理解什么是SpringMVC 理解SpringMVC的工作流程 学会使用SpringMVC封装请求…

C/C++流星雨

系列文章 序号直达链接1C/C爱心代码2C/C跳动的爱心3C/C李峋同款跳动的爱心代码4C/C满屏飘字表白代码5C/C大雪纷飞代码6C/C烟花代码7C/C黑客帝国同款字母雨8C/C樱花树代码9C/C奥特曼代码10C/C精美圣诞树11C/C俄罗斯方块12C/C贪吃蛇13C/C孤单又灿烂的神-鬼怪14C/C闪烁的爱心15C/C…

Vmware Vcenter7.0证书web续期发生错误

1. 故障描述 vSphere Client 版本 7.0.2.00200 vCenter _MACHINE_CERT快到期了,通过web界面更新证书失败 第一步先这样,重新续订一下证书 续订发生错误 2. 解决办法 2.1. 前提工作 登陆ssh到vcenter,重新生成证书 先关掉HA&#xff…

【合作原创】使用Termux搭建可以使用的生产力环境(五)

前言 在上一篇【合作原创】使用Termux搭建可以使用的生产力环境(四)-CSDN博客我们讲到了如何让proot-distro中的Debian声音驱动正常,将我们的系统备份后,通过VNC客户端连接到VNC服务器,这一篇我们来讲一下xfce桌面的美…

uniapp -- 实现页面滚动触底加载数据

效果 首选,是在pages.json配置开启下拉刷新 {"path": "pages/my/document/officialDocument","style": {"navigationStyle":</

Python之爬虫入门--示例(2)

一、Requests库安装 可以使用命令提示符指令直接安装requests库使用 pip install requests 二、爬取JSON数据 &#xff08;1&#xff09;、点击网络 &#xff08;2&#xff09;、刷新网页 &#xff08;3&#xff09;、这里有一些数据类型&#xff0c;选择全部 &#xff08…

OLLAMA+FASTGPT+M3E 大模型本地化部署手记

目录 1.安装ollama 0.5.1 2.下载大模型 qwen2.5 3b 3.开启WSL 4.更新wsl 5.安装ubuntu 6.docker下载 6.1 修改docker镜像源 6.2 开启WSL integration 7.安装fastgpt 7.1 创建fastgpt文件夹 7.2 下载fastgpt配置文件 8.启动容器 9.M3E下载 9.1 下载运行命令 9.2…

Linux网络基础知识————网络编程

计算机网络的体系结构 网络采用分而治之的方法设计&#xff0c;将网络的功能划分为不同的模块&#xff0c;以分层的形式有机结合在一起 每层实现不同的功能&#xff0c;其内部实现的方法对外部其他层次来说是透明的&#xff0c;每层向上一层提供服务&#xff0c;使用下一层提供…

【数据库】选择题+填空+简答

1.关于冗余数据的叙述中&#xff0c;不正确的是&#xff08;&#xff09; A.冗余的存在容易破坏数据库的完整新 B.冗余的存在给数据库的维护增加困难 C.不应该在数据库中存储任何冗余数据 D.冗余数据是指由基本数据导出的数据 C 2.最终用户使用的数据视图称为&#xff08;&…

unity3d—demo(实现给出图集名字和图片名字生成对应的图片)

目录 实现给出图集名字和图片名字生成对应的图片&#xff1a; 代码示例&#xff1a; dic: 键 是图集名称 值是一个字典 该字典键是图片名称 值是图片&#xff0c;结构如图&#xff1a; 测试代码&#xff1a; 结果&#xff1a; SpriteRenderer 讲解&#xff1a; Resour…

jmeter 提取数据写入文件

BeanShell PostProcessor FileWriter file new FileWriter("E:\\IOT\\cui家庭中心\\v3.8.0\\123.txt",true); BufferedWriter out new BufferedWriter(file); out.write(vars.get("localKey")"\n"); log.info("到这里了吗"); out.c…

Linux多进程开发-常用命令

进程 进程是计算机中正在运行的程序的实例。每个进程都有自己的地址空间、内存、文件和设备、线程以及其他系统资源。操作系统通过调度和管理进程来实现多任务处理&#xff0c;使得多个进程可以同时运行并与用户交互。在操作系统中&#xff0c;进程是基本的资源分配单位&#x…

Linux下nginx环境的搭建

1.Nginx的下载 nginx官网&#xff1a;nginx: download nginx的工作原理请移步&#xff1a; 2.nginx安装 2.1.上传文件 将nginx包上传到 /usr/local/src 下 如果你没有使用xftp的话&#xff0c;使用 rz -y 命令上传 下载依赖&#xff1a; yum install lrzsz 输入命令 r…

支持图像和视频理解多模态开源大模型:CogVLM2 CogVLM2-Video

CogVLM2和CogVLM2-Video是新一代的开源模型&#xff0c;支持图像和视频理解&#xff0c;具有显著的性能提升。最近发布的更新包括CogVLM2论文的发表、在线演示和对视频理解的支持&#xff0c;能够处理最多1分钟的视频。新模型支持中英文&#xff0c;文本长度可达8K&#xff0c;…