新書推薦:

《
日本佛教史纲
》
售價:HK$
92.4

《
给孩子的安全教育漫画:防走失、防拐骗 少儿安全教育专家GY局长 让孩子全面掌握保护自己方法
》
售價:HK$
41.8

《
多头政体——参与和反对(汉译名著18)
》
售價:HK$
61.6

《
政治经济学(汉译名著18)
》
售價:HK$
127.6

《
国内外高句丽渤海墓葬研究文献目录
》
售價:HK$
198.0

《
中国书法分体史(函套版)
》
售價:HK$
690.8

《
唐代官制:官吏体系与机构运行
》
售價:HK$
118.8

《
超简单的量子力学 波粒二象性 量子隧穿效应 不确定性原理 量子纠缠 一小时掌握描述微观世界本质规律的
》
售價:HK$
39.6
|
| 編輯推薦: |
|
想搞定复杂系统设计,应对大厂面试?本书专为你而来!由谷歌工程经理与Netflix高级工程师联合撰写,从CAP定理、分布式缓存等基础原理,到数据库、队列等核心组件,再到URL短链、仿Twitter等6大实战案例,全流程拆解系统设计逻辑。书中还配套面试指南与实操技巧,不管你是备战面试的求职者,还是想进阶的工程师、技术主管,都能夯实核心能力,轻松应对复杂系统设计挑战!
|
| 內容簡介: |
|
本书系统讲解复杂系统架构设计知识,兼具理论深度与实践价值。全书分为三部分,先阐述系统设计基础概念、分布式系统属性及核心定理与数据结构;再详解DNS、负载均衡器、数据库、分布式缓存等核心组件的设计与实现;最后通过API设计、安全防护等实践内容及URL短链、仿Twitter/Instagram/Google Docs等真实案例,结合面试指南与实用手册,助力读者掌握系统设计思维。本书面向软件工程师、面试求职者等群体,既夯实理论基础,又提供实操方法,帮助应对系统设计面试与实际工作中的复杂问题。
|
| 關於作者: |
迪伦德拉·辛哈(Dhirendra Sinha) 谷歌软件工程领导者,天使投资人,曾在多家创业公司担任战略与技术顾问。Dhirendra在软件工程领域深耕近20年,善于构建高度可扩展的复杂分布式系统,长于管理多团队的工程项目,职业生涯横跨思科、甲骨文、雅虎和谷歌等科技巨头,并在多家早期及成熟创业公司担任领导职务。除了扎实的软件工程实践经验,他还持续7年讲授分布式系统设计课程。Dhirendra拥有印度理工学院古瓦哈提分校工学学士学位和美国得克萨斯农工大学理学硕士学位。
特贾斯·乔普拉(Tejas Chopra) Netflix高级软件工程师,主导开发了支持Netflix推荐系统和个性化服务的机器学习平台。作为美国顶尖的EB1A(爱因斯坦)签证获得者,Tejas还荣获“40位40岁以下科技精英”奖项,两度登上TEDx演讲台,并当选英国计算机学会(BCS)会士。他经常在云计算、区块链、机器学习、软件开发和工程领导力等领域的重要会议和专题研讨会上发表演讲。2023年,Tejas获得印度成就者论坛颁发的“国际成就奖”。他在美国亚利桑那州先进技术大学担任软件开发客座教授,同时也是一位活跃的天使投资人。他拥有美国匹兹堡卡内基梅隆大学电气与计算机工程硕士学位。
|
| 目錄:
|
目 录 前言 作者简介 审校者简介 第一部分 系统设计基础 第1章 系统设计基础知识 3 1.1 什么是系统设计 3 1.1.1 软件系统 3 1.1.2 分布式软件系统 4 1.1.3 理解系统设计 5 1.2 系统设计的类型有哪些 6 1.2.1 高层系统设计 6 1.2.2 系统架构 6 1.2.3 数据流 6 1.2.4 可扩展性 7 1.2.5 容错性 7 1.2.6 低层系统设计 7 1.2.7 算法 8 1.2.8 数据结构 8 1.2.9 API 8 1.2.10 代码优化 8 1.3 系统设计在业界的重要性 9 1.4 凸显系统设计重要性的实践案例 10 1.5 总结 10 第2章 分布式系统属性 11 2.1 酒店客房预订示例 11 2.2 一致性 13 2.2.1 强一致性 13 2.2.2 最终一致性 14 2.3 可用性 16 2.4 理解分区容错性 16 2.4.1 网络分区 17 2.4.2 分区容错性 17 2.5 延迟 18 2.6 持久性 18 2.7 可靠性 19 2.8 容错性 19 2.9 可扩展性 20 2.9.1 垂直扩展 20 2.9.2 水平扩展 21 2.10 总结 22 第3章 分布式系统核心定理和数据 结构 23 3.1 CAP定理 24 3.2 PACELC定理 25 3.2.1 Paxos 26 3.2.2 Raft 28 3.3 BGP 30 3.3.1 拜占庭故障 31 3.3.2 拜占庭容错 32 3.3.3 现代拜占庭容错 32 3.4 FLP不可能性定理 32 3.5 一致性哈希 34 3.6 布隆过滤器 36 3.7 计数最小草图 38 3.8 超对数计数 40 3.9 总结 42 第二部分 分布式系统的核心组件 第4章 分布式系统的基础组件:DNS、负载均衡器与应用网关 47 4.1 DNS探析 47 4.2 DNS的可扩展性、可靠性与 一致性 52 4.2.1 可扩展性 52 4.2.2 可靠性 52 4.2.3 一致性 53 4.3 负载均衡器 53 4.3.1 部署负载均衡器 53 4.3.2 负载均衡器的优点 54 4.3.3 全局负载均衡与本地负载 均衡 55 4.3.4 DNS和GSLB 55 4.3.5 负载均衡算法 56 4.3.6 位于开放系统互连模型各 层级的负载均衡 58 4.3.7 部署负载均衡器 59 4.3.8 实现负载均衡器 59 4.4 应用网关 60 4.5 微服务架构 61 4.6 云原生部署方案 62 4.7 本地化部署方案 62 4.8 总结 63 第5章 设计与实现系统组件—— 数据库与存储 64 5.1 数据库 65 5.1.1 数据库类型 66 5.1.2 关系数据库 66 5.1.3 NoSQL数据库 67 5.1.4 对比关系数据库与NoSQL 数据库 67 5.2 键值存储 68 5.2.1 什么是键值存储 69 5.2.2 在分布式系统中的应用 69 5.2.3 设计键值存储系统 69 5.3 可扩展性与数据复制 70 5.3.1 提升可扩展性 70 5.3.2 一致性哈希 71 5.3.3 虚拟节点 71 5.3.4 数据冗余策略 72 5.4 实现get和put函数 73 5.4.1 实现get和put操作 73 5.4.2 使用r和w 74 5.5 键值存储的容错机制与故障 识别 74 5.5.1 管理临时故障 74 5.5.2 处理永久故障 75 5.5.3 提升环形成员关系以用于检测 故障 76 5.6 系统设计面试:键值存储的设计 要点与策略 77 5.7 DynamoDB 77 5.7.1 无固定样式 78 5.7.2 API 函数 78 5.7.3 DynamoDB的数据分区 78 5.7.4 DynamoDB的吞吐量优化 79 5.7.5 DynamoDB的高可用性 82 5.8 列族数据库 83 5.9 HBase 84 5.10 图数据库 90 5.11 Neo4j图数据库 91 5.12 关系建模与图建模 92 5.12.1 图建模 93 5.12.2 向现有图结构添加新节点 94 5.13 总结 95 5.14 参考文献 95 第6章 分布式缓存 96 6.1 什么是缓存 97 6.1.1 什么是分布式缓存 97 6.1.2 分布式缓存与常规缓存有何 区别 97 6.1.3 应用场景 98 6.1.4 使用分布式缓存的优势 99 6.1.5 使用分布式缓存的挑战 99 6.2 设计分布式缓存 100 6.2.1 需求 100 6.2.2 设计历程 101 6.3 主流分布式缓存方案 106 6.3.1 Redis 106 6.3.2 Memcached 106 6.3.3 如何在Redis与Memcached 之间选择 107 6.4 总结 107 第7章 发布/订阅系统与分布式 队列 109 7.1 分布式系统的演进历程 109 7.2 设计发布/订阅系统 112 7.2.1 发布/订阅系统的关键特征 112 7.2.2 发布/订阅系统的设计要点 113 7.3 Kafka 116 7.4 Kafka Streams 118 7.5 Kinesis 119 7.6 总结 120 第三部分 系统设计实践 第8章 系统组件的设计与实现: API、安全与指标 123 8.1 REST API 124 8.1.1 REST API的设计原则 124 8.1.2 REST API的应用场景 124 8.1.3 优势与不足 125 8.2 gRPC API 125 8.2.1 gRPC API的设计原则 125 8.2.2 gRPC API的应用场景 125 8.2.3 优势与不足 126 8.3 对比REST与gRPC 126 8.4 API安全 127 8.4.1 认证 128 8.4.2 授权 128 8.4.3 API的安全通信 129 8.4.4 速率限制 129 8.5 分布式系统日志 130 8.5.1 集中式日志 130 8.5.2 实施分布式日志的最佳实践 131 8.6 分布式系统的指标 131 8.6.1 指标类型 132 8.6.2 度量指标的开源工具 132 8.6.3 实施指标的最佳实践 133 8.7 分布式系统的告警 133 8.7.1 设计高效告警 133 8.7.2 开源告警工具 134 8.7.3 实施告警的最佳实践 134 8.8 分布式系统的链路追踪 134 8.8.1 分布式链路追踪 135 8.8.2 分布式链路追踪的开源工具 135 8.8.3 实施链路追踪的最佳实践 136 8.9 最佳实践 137 8.10 总结 137 第9章 系统设计——URL短链服务 138 9.1 实际应用场景 139 9.1.1 功能性需求 140 9.1.2 非功能性需求 140 9.2 客户端API需求 140 9.3 估算与计算 141 9.4 系统设计 142 9.4.1 核心挑战 142 9.4.2 数据库的选择 145 9.4.3 高层架构方案 145 9.5 需求验证 147 9.6 总结 147 第10章 系统设计——邻近服务 149 10.1 实际应用场景 149 10.2 功能性需求 151 10.3 非功能性需求 151 10.4 客户端API需求 151 10.5 估算与计算 152 10.6 系统设计 153 10.6.1 高层系统设计 153 10.6.2 核心挑战 154 10.6.3 最终的高层架构方案 158 10.7 需求验证 159 10.8 总结 159 第11章 设计仿Twitter服务 161 11.1 功能性需求 162 11.2 非功能性需求 163 11.3 数据模型 164 11.4 规模计算 165 11.5 高层系统设计 167 11.6 设计推文服务 170 11.6.1 数据存储 171 11.6.2 推文创建流程 171 11.6.3 推文检索流程 172 11.6.4 缓存 173 11.7 设计用户服务 174 11.7.1 数据存储 175 11.7.2 用户注册流程 176 11.7.3 身份认证流程 176 11.7.4 关注/取消关注流程 177 11.7.5 获取关注者与被关注者 178 11.8 低层系统设计—时间线 服务 179 11.8.1 数据流 179 11.8.2 时间线检索流程 180 11.8.3 基于推送的更新机制 181 11.9 设计搜索服务 182 11.9.1 数据流与索引 183 11.9.2 搜索查询处理 184 11.9.3 相关性评分与排序 184 11.10 其他考量因素 185 11.11 总结 185 第12章 设计仿Instagram服务 187 12.1 功能性需求 187 12.2 非功能性需求 189 12.3 设计数据模型 190 12.4 规模计算 191 12.5 高层系统设计 193 12.6 低层系统设计 195 12.6.1 设计照片上传服务 195 12.6.2 信息流服务 198 12.6.3 用户服务 200 12.7 其他考量因素 204 12.8 总结 205 第13章 设计仿Google Docs服务 207 13.1 功能性需求 208 13.2 非功能性需求 209 13.3 数据模型 210 13.4 规模计算 211 13.4.1 假设前提 212 13.4.2 存储需求 212 13.4.3 带宽考量 212 13.4.4 处理能力 213 13.5 高层系统设计 213 13.6 低层系统设计 216 13.6.1 设计文档服务 216 13.6.2 设计协作服务 222 13.6.3 设计访问控制服务 225 13.7 其他考量因素与最佳实践 230 13.8 总结 232 第14章 设计仿Netflix服务 233 14.1 功能性需求 233 14.2 非功能性需求 235 14.3 设计数据模型 235 14.4 规模计算 238 14.4.1 假设前提 238 14.4.2 存储容量估算 238 14.4.3 带宽估算 239 14.4.4 处理能力估算 239 14.5 高层系统设计 240 14.6 低层系统设计 242 14.6.1 视频服务 243 14.6.2 视频上传与存储 243 14.6.3 视频编码与转码 244 14.6.4 视频流媒体 245 14.6.5 缓存与内容分发 246 14.6.6 用户服务 247 14.6.7 用户认证与访问授权 248 14.6.8 用户资料管理 249 14.6.9 数据库与缓存 250 14.6.10 推荐服务 250 14.7 CDN 254 14.7.1 CDN架构与内容分发 255 14.7.2 请求路由与视频流传输 256 14.7.3 自适应比特率流媒体 257 14.7.4 内容安全与数字版权 管理 257 14.8 总结 258 第15章 面试指南 259 15.1 系统设计面试备考指南 259 15.1.1 基础概念解析 259 15.1.2 学习常见系统设计模式 260 15.1.3 系统设计实践 260 15.1.4 从在线资源中学习 261 15.1.5 培养和提升沟通技能 261 15.1.6 回顾与反思 262 15.2 面试要点与技巧 262 15.2.1 理解问题描述 262 15.2.2 分解问题 262 15.2.3 关键操作步骤 263 15.2.4 高效沟通设计方案 264 15.3 总结 265 第16章 系统设计实用手册 266 16.1 针对具体的应用场景,如何 选择数据存储方案 267 16.2 针对具体的应用场景,如何 选择数据结构 268 16.3 针对不同的应用场景,如何 选择组件 268 16.4 针对不同的应用场景,如何 选择协议 270 16.5 针对不同的核心挑战,采用 何种解决方案 271 16.6 总结 272
|
| 內容試閱:
|
前 言?Preface 系统设计是软件工程与架构领域的一项核心技能,它涵盖了为满足特定需求而定义系统架构、组件、模块、接口和数据的完整过程。本书旨在通过真实案例,系统性地讲解系统设计的理论概念与实际应用,为你提供全面的学习指南。 随着新技术与新范式的不断涌现,系统设计领域正在不断壮大与持续演进。软件系统日益呈现复杂化和分布式的特征,构建可扩展、可靠、高效的系统的能力变得愈发重要。本书旨在为读者提供必要的知识储备和工具支持,以应对当今技术环境下设计复杂系统的挑战。 本书主要聚焦于以下三个核心内容: 系统设计的基础概念与原则。 现代分布式系统的核心组件与技术。 系统设计的真实案例分析与研究。 本书将深入探讨上述各个方面,不仅为读者夯实系统设计理论基础,还将分享源自行业实践和最佳范例的实用经验。 本书将全面介绍系统设计的各类知识,深入讲解各种概念和技术,研究真实案例,从而为读者提供系统设计领域的专业指导。书中内容主要源自两个方面: 我们在软件行业多年的从业经验以及设计大规模系统积累的专业知识。 汇集来自各行业、领域和公司的专业人士及系统设计实践者的访谈与真知灼见。 最新的行业报告显示,市场对精通系统设计的专业人才的需求呈快速增长态势。无论是初创企业还是科技巨头,各类规模的公司都在积极寻求具备设计可扩展、健壮系统架构能力的工程师。随着企业日益依托复杂软件系统驱动运营与创新,这一趋势预计在未来数年仍将保持上升态势。 许多立志成为系统设计师的从业者,都会棘手于如何将理论知识转化为实践应用。本书兼具理论与实践,既深入阐述了系统设计的核心概念,又展现了将这些概念应用于实际场景的方法,以帮助读者跨越这一鸿沟。通过学习本书,读者能够满怀信心地应对系统设计面试,并解决现实工作中的各类设计难题。 读者对象 本书面向软件工程领域的广大读者群体,主要针对以下四类目标受众: 软件工程师和开发者:适合那些希望拓展编程之外的技能,并热衷于理解大规模系统设计与架构的从业者。本书将助力他们在职业发展道路上晋升为高级工程师、技术主管和系统架构师。 系统设计面试求职者:适用于准备参加顶级科技公司系统设计面试的专业技术人员。本书系统性地阐述了常见面试主题,并提供了一套解决设计问题的结构化方法。 工程经理和技术主管:适用于希望深入理解系统设计原理,从而更有效地引导团队并制定合理架构决策的管理者。 计算机专业的学生:适用于希望结合理论知识与实际系统构建的实践经验,深入了解真实系统开发的学生。 本书主要内容 第1章对系统设计基础知识进行了概述,阐释了各类系统设计的特点,强调了系统设计在业界的重要性。该章为后续内容奠定了理论基础。 第2章深入探讨了分布式系统属性,涉及一致性、可用性、分区容错性、延迟、持久性、可靠性和容错性等核心主题。掌握这些基本原则对构建健壮且可扩展的系统至关重要。 第3章阐述了分布式系统核心定理和数据结构。该章详细探讨了若干重要定理和算法,包括CAP定理、PACELC定理、Paxos和Raft算法以及拜占庭将军问题。同时还介绍了一致性哈希、布隆过滤器和HyperLogLog等在大规模系统设计中广泛应用的核心概念。 第4章着重介绍网络系统的基础组件。该章深入探讨了DNS(域名系统)、负载均衡器和应用网关这三个关键要素,它们是构建可扩展、高可靠分布式系统的重要组成部分。 第5章着重探讨了现代系统设计采用的各类数据库与存储技术,不仅系统性地阐述了关系数据库和NoSQL数据库的核心概念,还深入剖析了Cassandra、HBase、DynamoDB等具体技术实现。此外,该章还专门论述了键值存储(key-value store)系统的设计原理。 第6章深入探讨了分布式缓存领域,涵盖分布式缓存系统的设计原理,并对Redis和Memcached等主流缓存解决方案进行了详尽分析。 第7章重点探讨发布?/?订阅系统与分布式队列的设计原理,深入剖析了Kafka和Kinesis等关键技术,这些技术对构建实时数据处理系统至关重要。 第8章阐述分布式系统中设计与维护API的核心要素,深入探讨了REST和gRPC协议、API安全基础,以及构成系统可观测性的四大要素:日志记录、度量指标、告警机制和链路追踪。 第9章~第14章专门探讨真实的系统设计案例研究。每一章均遵循统一的结构: 系统需求 高层系统设计 低层系统设计 设计方案评估 这些案例研究涵盖了广泛的主流系统: 第9章:系统设计—— URL短链服务 第10章:系统设计——邻近服务 第11章:设计仿Twitter服务 第12章:设计仿Instagram服务 第13章:设计仿Google Docs服务 第14章:设计仿Netflix服务 第15章总结了面试指南。 第16章阐述了系统设计实用手册。 注意 通过深入研究这些案例,读者将获得把系统设计原则应用于真实场景的实践经验。这些章使理论与实践之间的天堑变为通途,提供了行业内设计和实现大规模系统的真知 灼见。 本书以系统设计面试指南作为收尾篇章。这部分内容详细阐述了各种系统设计面试形式,归纳了面试官的评估重点,突出说明此类面试在人才甄选过程中的关键作用。同时,还给出了各种实用的面试技巧,包括如何提出针对性问题、考量边界条件、进行快速估算,以及根据访问模式来设计系统等核心方法论。 如何充分利用本书 要充分掌握本书内容,读者需具备计算机科学概念、数据结构和算法等基础知识,最好能熟悉至少一门编程语言,掌握基本的网络概念。当然,我们也致力于通过清晰的概念阐述和必要的上下文说明,让不同背景的读者都能轻松理解本书内容。 我们建议你按顺序阅读本书,因为后续章节的内容都建立在前面章节介绍的基础概念之上。当然,经验丰富的读者也可以直接跳转到你感兴趣的具体主题或案例研究。在阅读过程中,我们鼓励你积极思考、勇于实践。在查看案例研究的解决方案之前,最好能独立思考,先尝试自行解决这些设计问题。这种学习方式有助于培养你的系统设计思维,提升问题解决能力。 切记,系统设计既是科学,也是艺术。虽然本书提供了扎实的理论基础和丰富的实例,但系统设计并不存在唯一“正确”的解决方案。最优设计往往源于对各种因素的权衡与取舍,以及对具体场景和需求的深入考量。 本书配有大量图表,旨在帮助读者直观地理解复杂概念和系统架构。这些可视化辅助材料在系统设计中扮演着关键角色,不仅有助于加深理解,也能有效地促进思想交流。 最后需要说明的是,系统设计仍是一个持续演进的领域。尽管本书讲解了它的基本原理及当前的最佳实践,但仍然鼓励读者保持求知欲,在本书所涉内容之外继续探索学习。建议你持续关注行业动态、新兴技术,深入研究领先企业应对系统扩展挑战的实践案例。 我们希望本书能够成为你在系统设计学习之路上的良师益友。无论是备战面试、谋求职业发展,还是对构建大规模系统抱有纯粹的热忱,相信本书都能为你提供富有洞见且切实可用的内容。 感谢你选择本书。我们很荣幸能与你共同开启这段学习旅程。让我们一起深入探索系统设计这个引人入胜的领域! 排版约定 本书使用了以下排版约定。 代码体:表示文本中的代码、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟URL、用户输入和Twitter账号等。例如:“Comment实体表示发布在照片上的评论。它包含评论文本、评论者的user_id、关联照片的photo_id以及创建时间戳。” 代码块表示如下:
粗体:表示新术语、重要词汇或屏幕上显示的文字。例如,菜单或对话框中的文字会以粗体显示。例如:“Photo Upload Service(照片上传服务)将公开以下API端点。” 提示或重要事项 按照此格式展示。
|
|