第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理论相关推荐

  1. 软件架构设计 大型网站技术架构与业务架构融合之道

    前言 架构是一种综合能力,而不是某一方面的技能.也正因为如此,本书提供的是一个全面的解决方案.方法论.成体系的设计思维.因此,本书将从基础技术谈起,再到高层技术.再到业务.管理,提供一个架构能力的全局 ...

  2. 读书笔记 之《软件架构设计: 大型网站技术架构与业务架构融合之道》

    大家好呀,我是小菜~ 帅哥美女,知道你们时间宝贵,那么就由小菜为你读好一本书,读一本好书,取其精华,与你共享~! 本文主要分享 <软件架构设计:大型网站技术架构与业务架构融合之道> 如有需 ...

  3. Web高级征程:《大型网站技术架构》读书笔记系列

    来源:http://www.cnblogs.com/edisonchou/p/3773828.html 一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术 ...

  4. 大型网站系统的特点和架构设计

    分布式架构 阿里P8架构师谈:淘宝技术架构从1.0到4.0的架构变迁 优知学院」淘宝技术架构的前世今生(上) 优知学院」淘宝架构的前世今生(下) 揭秘:一位亲历者眼中的淘宝技术架构发展之路 淘宝发展历 ...

  5. 读书笔记-大型网站技术架构

    1. 大型网站架构演化 1.1 大型网站软件系统的特点 大型互联网应用系统的特点 -高并发,大流量 -高可用 -海量数据 -用户分布广泛,网络情况复杂 -完全环境恶劣 -需求快速变更,发布频繁 -渐进 ...

  6. 大型网站的演化之路——读《大型网站技术架构》

    大型网站的演化之路--读<大型网站技术架构> ____ author:姚毛毛的博客 & 妖生 01 大型网站or软件有什么特点? 高并发.大流量,微信都日活10亿了 7×24的高可 ...

  7. 大型网站技术架构核心原理剖析,文末附知识图谱下载

    什么是软件架构 维基百科定义:软件架构是指有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计. 软件架构5大要素: 性能 可用性 伸缩性 扩展性 安全性 可以通过考察这5大要素来衡量 ...

  8. 大型网站技术架构演进

    文章目录 系列文章目录 前言 1 构建 型网站:分布式改造.. ... .- .. .. .-. ..... ... .. .. .. .. .. .. .. .. .. .. .. 1 1.1 为什 ...

  9. Web信息架构——设计大型网站(第3版)

    Web信息架构--设计大型网站(第3版)(久负盛名经典再现,信息架构设计领域基石之作!) [美]]Peter Morville(彼得·莫维尔)  Louis Rosenfeld(路易斯·罗森菲尔德) ...

  10. 大型网站技术架构:核心原理与案例分析pdf

    下载地址:网盘下载 编辑推荐 编辑 本书作者是阿里巴巴网站构建的亲历者,拥有核心技术部门的一线工作经验,直接体验了大型网站构建与发展过程中的种种生与死,蜕与变,见证了一个网站架构从幼稚走向成熟稳定的历 ...

最新文章

  1. R语言is.na函数实战(删除、替换、统计、条件判断等)
  2. typeorm 更新_再热我们也在更新 - Midway 8 月内容汇总
  3. [Android] Android颜色对应的xml配置值
  4. 迭代与递归实现无限级分类
  5. 外汇汇率接口 java_基于JAVA的货币汇率api调用代码实例
  6. 介绍一个好用的静态图片合成为 gif 动画的在线网站
  7. 阿里云RPA(机器人流程自动化)干货系列之二:认识RPA(下)
  8. jQuery判断当前点击的是第几个li的代码
  9. mysql select 效能_MYSQL的联合查询最好是少用,效能差异巨大
  10. python按比例生成数据组_基于python中的一个值生成“正态分布”数据
  11. C89,C99: C数组结构体联合体快速初始化
  12. FPGA、AD9371、AD9009、RF SOC介绍
  13. php 递归中的全局变量,PHP递归函数内的静态变量
  14. Android OpenGL ES纹理总结、纹理坐标系说明、使用代码示例
  15. css 设置鼠标经过的时候鼠标变成手状假装是个链接
  16. h5获取视频的第一帧
  17. 飞思卡尔MC9S12G64串口发送接收驱动
  18. ArrayList,LinkedList,Vector三者的异同
  19. OpenKruise :SidecarSet 助力 Mesh 容器热升级,TCP的三次握手、四次挥手
  20. 新零售系统mysql设计(评价表)

热门文章

  1. 【【henuacm2016级暑期训练】动态规划专题 D】Writing Code
  2. 使用VueJs开发单页面应用经验总结
  3. 大数据 数据平台方案评估
  4. 做高频通用还是低频专业
  5. Android界面绘制流程--------How Android Draws Views
  6. Struts2学习笔记(十) OGNL
  7. Lambda表达式公共拼接函数(原创)
  8. 接口为什么不能有构造函数
  9. BZOJ 4415 洛谷 3988 [Shoi2013]发牌
  10. 欧拉函数之和(51nod 1239)