12.软件架构设计:大型网站技术架构与业务架构融合之道 --- CAP理论
第12章 CAP理论
12.1 CAP理论的误解 C:一致性。如事务一致性,多副本一致性。A:可达性。客户端超时,也是不可达。P:网络分区。系统一旦变成分布式,有多个节点,就可能存在超时或者网络中断。在大规模分布式系统场景下,P(网络分区)往往是一个必然的存在,只能在C和A之间权衡。在实际中,大部分都是AP或CP的系统,而很少有CA的系统。
CP的系统追求强一致性,比如zookeeper,但牺牲了一定的性能;AP的系统追求高可用,牺牲了一定的一致性,比如数据库的主从复制,kafka的主从复制。为什么很少有CA的系统?因为要实现A(高可用),必然需要冗余,有了冗余就可能存在网络分区(P)。比如传统的关系型数据库实现了事务ACID,也就是强
一致性(C),但是单机版没有A,也没有P。要实现A,需要加从库,但也只能解决A的问题,却无法保证强一致性,转而寻求最终一致性。通过分析可以看出,P并不是通过牺牲A或者C换取的,而是需要通过网络基础设施的稳定性来保证。12.2 现实世界不存在“强一致性”(PACELC理论) 正因为 "延迟" 的必然存在,CAP的扩展理论 PACELC 应用而生。其中的P,A,C 没有变化,只是引入了 Latency(延迟)因素,E指的是 Else。当P出现的时候,只能在A和C之间做权衡,牺牲A换取C 或者 牺牲C换取A(也就是CAP理论)。否则,当P没有出现(网络正常),需要在L和C之间做权衡。12.3 典型案例:分布式锁 举例说明分布式锁有多难:方案1:基于Zookeeper实现最常见的分布式锁是基于zookeeper来实现的,利用zookeeper的"瞬时节点"的特性。每次加锁都是创建一个瞬时节点,释放锁则删除瞬时节点。因为zookeeper和客户端之间通过心跳检测客户端是否宕机,如果宕机,则zookeeper检测到后自动删除瞬时节点,从而释放锁。zookeeper自身用zab协议保证高可用和强一致性,但该方案有2个问题:1.性能问题。在高并发下qps不够。2.因为用心跳检测客户端是否宕机,当网络超时或客户端发生full GC的时候会产生误判。本来客户端没有宕机,却误判为宕机了,锁被释放,然后被另外一个进程拿到了,从而导致两个进程拿到同一把锁。这也就是通常说的"脑裂"。方案2:基于Redis实现redis的性能比zookeeper好,所以通常用来实现分布式锁,但问题也很明显。问题1:redis没有zookeeper强一致性的zab协议,redis主从之间采用的是异步复制,如果主宕机,则切换到从,会导致部分锁的数据丢失,也就是多个进程会拿到同一把锁。问题2:客户端和redis之间没有心跳,如果客户端在拿到锁之后,释放锁之前宕机,锁将永远不能释放。要解决这个问题,是给锁加一个超时时间,过了一段时间后,锁将无条件释放。但这又带来了第三个问题。问题3:如果客户端不是真的宕机,而只是因为full GC发生了阻塞,或业务逻辑的执行时间超出了锁的超时时间,则锁被无条件释放,也会导致两个进程拿到同一把锁。可见,要实现一个高可用,通用的,强一致,高并发的分布式锁很难。也正是因为如此,在实际业务场景中,应尽量避免用分布式锁,或用串行化,弱一致性
等策略。即使要用分布式锁,往往也是针对特定的业务场景,对问题有兜底方案。
12.软件架构设计:大型网站技术架构与业务架构融合之道 --- CAP理论相关推荐
- 软件架构设计 大型网站技术架构与业务架构融合之道
前言 架构是一种综合能力,而不是某一方面的技能.也正因为如此,本书提供的是一个全面的解决方案.方法论.成体系的设计思维.因此,本书将从基础技术谈起,再到高层技术.再到业务.管理,提供一个架构能力的全局 ...
- 读书笔记 之《软件架构设计: 大型网站技术架构与业务架构融合之道》
大家好呀,我是小菜~ 帅哥美女,知道你们时间宝贵,那么就由小菜为你读好一本书,读一本好书,取其精华,与你共享~! 本文主要分享 <软件架构设计:大型网站技术架构与业务架构融合之道> 如有需 ...
- Web高级征程:《大型网站技术架构》读书笔记系列
来源:http://www.cnblogs.com/edisonchou/p/3773828.html 一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术 ...
- 大型网站系统的特点和架构设计
分布式架构 阿里P8架构师谈:淘宝技术架构从1.0到4.0的架构变迁 优知学院」淘宝技术架构的前世今生(上) 优知学院」淘宝架构的前世今生(下) 揭秘:一位亲历者眼中的淘宝技术架构发展之路 淘宝发展历 ...
- 读书笔记-大型网站技术架构
1. 大型网站架构演化 1.1 大型网站软件系统的特点 大型互联网应用系统的特点 -高并发,大流量 -高可用 -海量数据 -用户分布广泛,网络情况复杂 -完全环境恶劣 -需求快速变更,发布频繁 -渐进 ...
- 大型网站的演化之路——读《大型网站技术架构》
大型网站的演化之路--读<大型网站技术架构> ____ author:姚毛毛的博客 & 妖生 01 大型网站or软件有什么特点? 高并发.大流量,微信都日活10亿了 7×24的高可 ...
- 大型网站技术架构核心原理剖析,文末附知识图谱下载
什么是软件架构 维基百科定义:软件架构是指有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计. 软件架构5大要素: 性能 可用性 伸缩性 扩展性 安全性 可以通过考察这5大要素来衡量 ...
- 大型网站技术架构演进
文章目录 系列文章目录 前言 1 构建 型网站:分布式改造.. ... .- .. .. .-. ..... ... .. .. .. .. .. .. .. .. .. .. .. 1 1.1 为什 ...
- Web信息架构——设计大型网站(第3版)
Web信息架构--设计大型网站(第3版)(久负盛名经典再现,信息架构设计领域基石之作!) [美]]Peter Morville(彼得·莫维尔) Louis Rosenfeld(路易斯·罗森菲尔德) ...
- 大型网站技术架构:核心原理与案例分析pdf
下载地址:网盘下载 编辑推荐 编辑 本书作者是阿里巴巴网站构建的亲历者,拥有核心技术部门的一线工作经验,直接体验了大型网站构建与发展过程中的种种生与死,蜕与变,见证了一个网站架构从幼稚走向成熟稳定的历 ...
最新文章
- “用手机就能访问卫星” 软件定义升级卫星智能
- maven 编译mybatis项目时xml文件无法编译到target目录下的解决方法
- 运维利器:万能的 strace
- java 超时异常_Java如何实现任务超时处理
- json string 格式_python中json函数的用法
- community 计算模块度_聚苯乙烯泡沫模块可以用在哪些建筑上?
- javascript 理解对象--- 定义多个属性和读取属性的特性
- 最良心不过AMD AM4接口下一代可继续用
- 今天写出一个十分弱智的bug!
- 本地yum源安装teamviewer
- 三线压力传感器原理_常见压力传感器原理及其接头
- mysql数据库druid密码加密_Spring+mysql+druid对数据库连接的用户名密码加密-Go语言中文社区...
- 三层交换机LLDP协议对 L2/L3端口,报文处理实验
- 连接服务器显示用户账户无效,发现MT4真实账户无效该怎么办?
- 解析智能推荐系统开发中十大关键要素
- 这么炫酷的轮播图·你想学吗?
- 字符串常用方法(1)
- Shiro的认证原理(Subject#login的背后故事)
- 亚马逊AWS云架构支柱与数字化转型
- html国内旅游计划,Web实验一 国内旅游界面
热门文章
- failed to load resource the server responded with a status of 500 (internal server error)
- c/c++ linux 进程 fork wait函数
- ExtJs gridPanel Column 时间格式化
- 不要奢望.NET能够跨平台
- 苹果谷歌双双被曝,你的手机正在窃听你的生活
- 如何用R语言做词云图,以某部网络小说为例
- 使用kubernetes 官网工具kubeadm部署kubernetes(使用阿里云镜像)
- Linux/Unix 中 wheel 组的来源
- bzoj 1396: 识别子串 bzoj 2865: 字符串识别【后缀数组+线段树】
- SQL知识点脑图(一张图总结SQL)