
本书通过理论篇、实践篇、工程篇、总结篇四篇(13章),介绍了分布式系统的知识体系。理论篇介绍了一致性、共识、分布式约束等知识;实践篇介绍了分布式锁、分布式事务、服务发现与调用、服务保护与网关、幂等接口等知识;工程篇介绍了消息系统中间件 RabbitMQ 和分布式协调中间件ZooKeeper等知识;总结篇则帮助大家厘清分布式系统的知识脉络。本书适合想要学习分布式系统理论、实践、工程知识的学生、软件开发者。
随着软件复杂度的增加和用户规模的增长,分布式系统得到了广泛应用。对于软件开发者而言,掌握分布式系统的相关知识是十分必要的。 但分布式系统涉及理论、实践、工程等多方面内容。这些内容往往交织穿插在一起,给软件开发者的学习带来了不少困难,让许多软件开发者在学习过程中感到混乱和迷茫。 为了帮助读者学习分布式系统,本书对分布式系统的相关理论、实践、工程知识进行了详细的介绍,理论联系实践、实践结合工程,层层递进,力求让读者知其然并知其所以然,建立完整的分布式系统知识体系。 本书共分为4篇,13章。 理论篇(第1章~第4章)介绍了分布式系统的概念,并讨论了分布式系统的优缺点及需要面对的问题。然后,从这些问题入手,讨论了一致性、共识、分布式约束等重要理论知识。该篇内容将为后续的实践篇、工程篇提供清晰、明确的理论指引。 实践篇(第5章~第9章)介绍了分布式锁、分布式事务、服务发现与调用、服务保护与网关、幂等接口等知识,向读者展示了理论篇所述的内容如何具体落地实施。读者通过该篇内容的学习,会了解许多架构思想和实践技巧。 工程篇(第10章~第12章)以搭建具体的工程项目为导向,向读者介绍了分布式系统中间件。其中,着重介绍了消息系统中间件RabbitMQ和分布式协调中间件ZooKeeper。该篇与理论篇、实践篇相呼应,但更加贴近工程实际,可以直接将其中的内容作为工程开发时的参考资料。 总结篇(第13章)对前面3篇的内容进行了汇总梳理,帮助读者厘清分布式系统的知识脉络。 本书是一本向读者阐述分布式系统理论、实践、工程知识的书籍,更是一本帮助读者建立完整的分布式系统知识体系的书籍。 本书内容的涵盖范围很广,涉及数学、算法、架构、编程、中间件等多个领域。在本书的筹备过程中,作者阅读了众多书籍、查阅了许多论文,前后历时近两年。在本书写作过程中,为确保内容简单易懂,作者多次斟酌和修改了行文脉络。在本书完稿后,为保证内容的翔实可靠,作者邀请了国内外学术、工程领域的多位专家、学者对本书的数学、算法等内容进行了审阅。其中,周健博士等人从各自的专业领域出发,提出了很多宝贵的意见和建议。 本书的出版还得到了李冰编辑的大力支持。崔宝顺等人也参与写作并提供了大量帮助。 由于作者水平有限,书中难免有疏漏之处,敬请读者批评指正。 真心希望本书能够给读者带来架构能力和软件开发能力的提升。 易哥 2021年8月
目录 理论篇 第1章 分布式概述 2 1.1 概述 2 1.2 应用的演进历程 3 1.2.1 单体应用 3 1.2.2 集群应用 4 1.2.3 狭义分布式应用 9 1.2.4 微服务应用 11 1.3 分布式系统概述 12 1.3.1 分布式系统的定义 12 1.3.2 分布式一致性问题 14 1.3.3 分布式应用中的节点 15 1.4 分布式应用的优势 16 1.5 分布式应用的问题 17 1.6 本章小结 20 第2章 一致性 21 2.1 一致性的概念 21 2.1.1 ACID一致性 22 2.1.2 CAP一致性 23 2.1.3 两种一致性的关系 23 2.2 一致性的强弱 24 2.2.1 严格一致性 25 2.2.2 顺序一致性 25 2.2.3 线性一致性 27 2.2.4 最终一致性 30 2.2.5 总结 31 2.3 一致性算法 32 2.4 两阶段提交 33 2.4.1 具体实现 33 2.4.2 线性一致性证明 35 2.4.3 优劣 39 2.5 三阶段提交 39 2.5.1 具体实现 40 2.5.2 优劣 42 2.6 本章小结 44 第3章 共识 46 3.1 共识与一致性 46 3.1.1 共识的概念 47 3.1.2 再论“一致性” 49 3.2 拜占庭将军问题 51 3.3 算法的容错性 54 3.3.1 非拜占庭容错算法 55 3.3.2 拜占庭容错算法 55 3.4 共识算法 56 3.5 Paxos算法 56 3.5.1 提出与证明 57 3.5.2 算法的内容 60 3.5.3 算法实现分析 62 3.5.4 理解与示例 64 3.6 Raft算法 65 3.6.1 Raft算法的内容 66 3.6.2 Raft算法的保证 70 3.6.3 总结分析 73 3.7 本章小结 74 第4章 分布式约束 76 4.1 CAP定理 76 4.1.1 定理的内容 76 4.1.2 示例与理解 77 4.2 从CAP定理到BASE定理 78 4.3 BASE定理 80 4.3.1 BASE定理的含义 80 4.3.2 BASE定理的应用 81 4.4 本章小结 83 实践篇 第5章 分布式锁 86 5.1 产生背景 86 5.2 特性 88 5.2.1 全局性 88 5.2.2 唯一性 89 5.2.3 遵从性 90 5.3 设计要点 90 5.4 实现 91 5.4.1 逻辑分布式锁 91 5.4.2 唯一性索引分布式锁 92 5.4.3 唯一性校验分布式锁 93 5.4.4 一致性分布式锁 94 5.5 应用场景 96 5.6 本章小结 96 第6章 分布式事务 97 6.1 本地事务与分布式事务 98 6.2 分布式事务的类别 99 6.2.1 应用内多数据库事务 99 6.2.2 单体应用间事务 99 6.2.3 分布式系统内事务 100 6.2.4 分布式系统间事务 101 6.3 分布式事务的类别总结 101 6.4 应用内多数据库事务方案 102 6.5 单体应用间事务方案 104 6.5.1 化为本地事务 104 6.5.2 化为应用内多数据库事务 105 6.5.3 TCC 106 6.5.4 本地异步消息机制 111 6.5.5 异步消息中心机制 113 6.6 近似事务 114 6.7 本章小结 116 第7章 服务发现与调用 117 7.1 分布式带来的问题 117 7.2 服务发现 119 7.2.1 服务发现模型中的角色 119 7.2.2 反向代理模型 120 7.2.3 注册中心模型 120 7.2.4 服务网格模型 122 7.2.5 三种模型的比较 123 7.3 服务调用 123 7.3.1 背景介绍 123 7.3.2 基于接口的调用 125 7.3.3 远程过程调用 126 7.4 本章小结 130 第8章 服务保护与网关 131 8.1 服务保护 131 8.1.1 理论依据 132 8.1.2 隔离 133 8.1.3 限流 135 8.1.4 降级 139 8.1.5 熔断 142 8.1.6 恢复 144 8.2 服务网关 145 8.2.1 产生背景 145 8.2.2 功能 146 8.2.3 结构 147 8.3 本章小结 147 第9章 幂等接口 148 9.1 概述 148 9.1.1 幂等接口概述 148 9.1.2 章节结构 150 9.2 代数系统 151 9.2.1 代数系统的定义 151 9.2.2 特殊元素 151 9.2.3 幂等 154 9.3 函数 155 9.3.1 函数的定义 155 9.3.2 复合函数 157 9.4 复合函数的幂等化 157 9.4.1 函数的幺元化 157 9.4.2 函数的零元化 158 9.4.3 运算的幂等化 160 9.4.4 复合函数幂等化总结 161 9.5 接口的幺元化 161 9.6 接口的零元化 162 9.7 调用的幂等化 163 9.7.1 判断插入数据 163 9.7.2 判断删除数据 164 9.7.3 判断数据版本 164 9.7.4 拦截重试调用 166 9.8 幂等接口总结 167 9.9 本章小结 168 工程篇 第10章 分布式中间件概述 171 第11章 RabbitMQ详解 174 11.1 消息系统概述 174 11.1.1 消息系统模型 174 11.1.2 消息系统的应用 175 11.2 RabbitMQ概述 177 11.3 RabbitMQ的组件 177 11.3.1 Exchange 177 11.3.2 Queue 178 11.3.3 Message 178 11.4 RabbitMQ的连接 179 11.4.1 生产者与Exchange 179 11.4.2 Exchange与Queue 180 11.4.3 Queue与消费者 181 11.5 附加功能 182 11.5.1 投递确认功能 182 11.5.2 持久化功能 183 11.5.3 消费确认功能 183 11.5.4 逐条派发功能 184 11.5.5 RPC功能 184 11.6 模型与应用 185 11.6.1 点对点模型 185 11.6.2 发布订阅模型 186 11.7 本章小结 187 第12章 ZooKeeper详解 188 12.1 单机配置与启动 188 12.1.1 运行配置 189 12.1.2 启动 190 12.2 数据模型 191 12.2.1 时间语义 191 12.2.2 树状模型 192 12.2.3 znode的数据与状态 192 12.2.4 znode的可选特性 194 12.2.5 znode的限额 196 12.2.6 znode权限设置 197 12.3 交互式命令行客户端 201 12.3.1 设置命令 202 12.3.2 znode操作命令 203 12.3.3 使用示例 205 12.4 监听器 206 12.4.1 特性 206 12.4.2 事件通知 209 12.4.3 交互式命令行客户端中的监听器 210 12.4.4 其他客户端中的监听器 210 12.5 连接与会话 211 12.5.1 连接建立 211 12.5.2 服务器切换 214 12.5.3 会话状态 215 12.5.4 连接监听器 216 12.6 集群模式 217 12.6.1 集群配置与启动 217 12.6.2 一致性实现 218 12.6.3 一致性级别讨论 221 12.7 应用示例 226 12.8 应用场景 230 12.8.1 节点命名 231 12.8.2 服务发现 232 12.8.3 应用配置 233 12.8.4 分布式锁 233 12.9 本章小结 235 总结篇 第13章 再论分布式系统 238 13.1 分布式与一致性 238 13.2 本书脉络 240 13.2.1 理论篇 240 13.2.2 实践篇 242 13.2.3 工程篇 243 13.3 总结与展望 244 13.3.1 总结 244 13.3.2 展望 245 参考文献 247