描述
包 装: 平塑勒是否套装: 否国际标准书号ISBN: 9787121465499
内容简介
系统设计面试被认为是所有技术面试中难度最大的面试,因为面试题的范围都非常广且模糊,其答案也是开放的,不存在标准答案或正确答案。本书是专门为准备系统设计面试的读者而撰写的,重点讨论了分布式系统中的常用组件和大型Web应用的系统架构,涵盖了几类常见的典型应用,包括聊天系统、视频流系统、文件存储系统(云盘)、支付系统等,旨在帮助读者掌握构建一个可扩展的系统所需的基础知识,为面试做好充分准备。作为过来人,作者提出了应对面试题的“四步法”,即确定问题范围→总体设计→细节设计→总结,书中的案例基本上都是按照这个步骤进行解析的。这种解题框架有助于在面试时搞清楚系统的需求、限制和瓶颈,理清思路,有条不紊地作答。通过本书,读者可以了解不同Web应用的系统设计方案的要点及采用的技术,据此查漏补缺,补齐自己知识体系中的短板,为面试成功增添更多的可能。而对于已经是架构师的读者而言,书中的案例将为他们提供新的思路和灵感,有助于他们在面试中更加从容地展现自己的设计思路和实践经验。
目 录
1 从0到100万用户的扩展
1.1 单服务器配置
1.2 数据库
1.2.1 使用何种数据库
1.3 纵向扩展 vs. 横向扩展
1.4 负载均衡器
1.5 数据库复制
1.6 缓存
1.6.1 缓存层
1.6.2 使用缓存时的注意事项
1.7 内容分发网络
1.7.1 使用CDN时的注意事项
1.8 无状态网络层
1.8.1 有状态架构
1.8.2 无状态架构
1.9 数据中心
1.10 消息队列
1.11 记录日志、收集指标与自动化
1.11.1 添加消息队列和各种工具
1.12 数据库扩展
1.12.1 纵向扩展
1.12.2 横向扩展
1.13 用户量达到甚至超过了100万
2 封底估算
2.1 2的幂
2.2 每个程序员都应该知道的操作耗时
2.3 可用性相关的数字
2.4 案例:估算推特的QPS和存储需求
2.5 小技巧
3 系统设计面试的框架
3.1 有效的系统设计面试的四个步骤
3.1.1 第一步:理解问题并确定设计的边界
3.1.2 第二步:提议高层级的设计并获得认同
3.1.3 第三步:设计继续深入
3.1.4 第四步:总结
3.2 面试中每一步的时间分配
4 设计限流器
4.1 第一步:理解问题并确定设计的边界
4.2 第二步:提议高层级的设计并获得认同
4.2.1 在哪里实现限流器
4.2.2 流量限制算法
4.2.3 高层级架构
4.3 第三步:设计继续深入
4.3.1 流量限制规则
4.3.2 超过流量的限制
4.3.3 详细设计
4.3.4 分布式系统中的限流器
4.3.5 性能优化
4.3.6 监控
4.4 第四步:总结
5 设计一致性哈希系统
5.1 重新哈希的问题
5.2 一致性哈希
5.2.1 哈希空间和哈希环
5.2.2 哈希服务器
5.2.3 哈希键
5.2.4 查找服务器
5.2.5 添加服务器
5.2.6 移除服务器
5.2.7 两个问题
5.2.8 虚拟节点
5.2.9 找到受影响的键
5.3 总结
6 设计键值存储系统
6.1 理解问题并确定设计的边界
6.2 单服务器的键值存储
6.3 分布式键值存储
6.3.1 CAP理论
6.3.2 系统组件
6.3.3 数据分区
6.3.4 数据复制
6.3.5 一致性
6.3.6 不一致性的解决方案:版本控制
6.3.7 处理故障
6.3.8 系统架构图
6.3.9 写路径
6.3.10 读路径
6.4 总结
7 设计分布式系统中的唯一ID生成器
7.1 第一步:理解问题并确定设计的边界
7.2 第二步:提议高层级的设计并获得认同
7.2.1 多主复制
7.2.2 UUID
7.2.3 工单服务器
7.2.4 推特的雪花系统
7.3 第三步:设计继续深入
7.4 第四步:总结
8 设计URL缩短器
8.1 第一步:理解问题并确定设计的边界
8.1.1 封底估算
8.2 第二步:提出高层级的设计并获得认同
8.2.1 API端点
8.2.2 URL重定向
8.2.3 缩短URL
8.3 第三步:设计继续深入
8.3.1 数据模型
8.3.2 哈希函数
8.3.3 深入探讨URL缩短流程
8.3.4 深入探讨URL重定向流程
8.4 第四步:总结
9 设计网络爬虫
9.1 第一步:理解问题并确定设计的边界
9.2 第二步:提议高层级的设计并获得认同
9.3 第三步:设计继续深入
9.3.1 DFS vs. BFS
9.3.2 URL前线
9.3.3 HTML下载器
9.3.4 健壮性
9.3.5 可扩展性
9.3.6 检测和避免有问题的内容
9.4 第四步:总结
10 设计通知系统
10.1 第一步:理解问题并确定设计的边界
10.2 第二步:提议高层级的设计并获得认同
10.2.1 不同类型的通知
10.2.2 联系信息的收集流程
10.2.3 通知的发送与接收流程
10.3 第三步:设计继续深入
10.3.1 可靠性
10.3.2 其他组件和要考虑的因素
10.3.3 更新后的设计
10.4 第四步:总结
11 设计news feed系统
11.1 第一步:理解问题并确定设计的边界
11.2 第二步:提议高层级的设计并获得认同
11.2.1 news feed API
11.2.2 feed的发布
11.2.3 news feed的构建
11.3 第三步:设计继续深入
11.3.1 深入探讨feed的发布流程
11.3.2 深入探讨news feed的获取流程
11.3.3 缓存架构
11.4 第四步:总结
12 设计聊天系统
12.1 第一步:理解问题并确定设计的边界
12.2 第二步:提议高层级的设计并获得认同
12.2.1 轮询
12.2.2 长轮询
12.2.3 WebSocket
12.2.4 高层级设计
12.2.5 数据模型
12.3 第三步:设计继续深入
12.3.1 服务发现
12.3.2 消息流
12.3.3 显示在线状态
12.4 第四步:总结
13 设计搜索自动补全系统
13.1 第一步:理解问题并确定设计的边界
13.1.1 封底估算
13.2 第二步:提议高层级的设计并获得认同
13.2.1 数据收集服务
13.2.2 查询服务
13.3 第三步:设计继续深入
13.3.1 字典树数据结构
13.3.2 数据收集服务
13.3.3 查询服务
13.3.4 字典树操作
13.3.5 扩展存储
13.4 第四步:总结
14 设计视频分享系统
14.1 第一步:理解问题并确定设计的边界
14.1.1 封底估算
14.2 第二步:提议高层级的设计并获得认同
14.2.1 视频上传流程
14.2.2 视频流式传输流程
14.3 第三步:设计继续深入
14.3.1 视频转码
14.3.2 有向无环图模型
14.3.3 视频转码架构
14.3.4 系统优化
14.3.5 错误处理
14.4 第四步:总结
15 设计云盘
15.1 第一步:理解问题并确定设计的边界
15.1.1 封底估算
15.2 第二步:提议高层级的设计并获得认同
15.2.1 API
15.2.2 跳出单服务器设计
15.2.3 同步冲突
15.2.4 高层级设计
15.3 第三步:设计继续深入
15.3.1 块服务器
15.3.2 高一致性需求
15.3.3 元数据数据库
15.3.4 上传流程
15.3.5 下载流程
15.3.6 通知服务
15.3.7 节约存储空间
15.3.8 故障处理
15.4 第四步:总结
16 设计支付系统
16.1 第一步:理解问题并确定设计的边界
16.2 第二步:提议高层级的设计并获得认同
16.2.1 收款流程
16.2.2 复式记账系统(Double-Entry System)
16.2.3 托管支付页面
16.2.4 付款流程
16.2.5 实时卖家仪表板
16.3 第三步:设计继续深入
16.3.1 重试和幂等
16.3.2 同步支付 vs. 异步支付
16.3.3 一致性
16.3.4 处理支付失败
16.3.5 支付安全
16.4 第四步:总结
17 设计指标监控和告警系统
17.1 第一步:理解问题并确定设计的边界
17.1.1 高层级需求
17.2 第二步:提议高层级的设计并获得认同
17.2.1 基本原理
17.2.2 数据模型
17.2.3 高层级设计
17.3 第三步:设计继续深入
17.3.1 指标数据的收集
17.3.2 扩展系统
17.3.3 查询服务
17.3.4 存储层
17.3.5 告警系统
17.3.6 可视化系统
17.4 第四步:总结
18 继续学习
后记
1.1 单服务器配置
1.2 数据库
1.2.1 使用何种数据库
1.3 纵向扩展 vs. 横向扩展
1.4 负载均衡器
1.5 数据库复制
1.6 缓存
1.6.1 缓存层
1.6.2 使用缓存时的注意事项
1.7 内容分发网络
1.7.1 使用CDN时的注意事项
1.8 无状态网络层
1.8.1 有状态架构
1.8.2 无状态架构
1.9 数据中心
1.10 消息队列
1.11 记录日志、收集指标与自动化
1.11.1 添加消息队列和各种工具
1.12 数据库扩展
1.12.1 纵向扩展
1.12.2 横向扩展
1.13 用户量达到甚至超过了100万
2 封底估算
2.1 2的幂
2.2 每个程序员都应该知道的操作耗时
2.3 可用性相关的数字
2.4 案例:估算推特的QPS和存储需求
2.5 小技巧
3 系统设计面试的框架
3.1 有效的系统设计面试的四个步骤
3.1.1 第一步:理解问题并确定设计的边界
3.1.2 第二步:提议高层级的设计并获得认同
3.1.3 第三步:设计继续深入
3.1.4 第四步:总结
3.2 面试中每一步的时间分配
4 设计限流器
4.1 第一步:理解问题并确定设计的边界
4.2 第二步:提议高层级的设计并获得认同
4.2.1 在哪里实现限流器
4.2.2 流量限制算法
4.2.3 高层级架构
4.3 第三步:设计继续深入
4.3.1 流量限制规则
4.3.2 超过流量的限制
4.3.3 详细设计
4.3.4 分布式系统中的限流器
4.3.5 性能优化
4.3.6 监控
4.4 第四步:总结
5 设计一致性哈希系统
5.1 重新哈希的问题
5.2 一致性哈希
5.2.1 哈希空间和哈希环
5.2.2 哈希服务器
5.2.3 哈希键
5.2.4 查找服务器
5.2.5 添加服务器
5.2.6 移除服务器
5.2.7 两个问题
5.2.8 虚拟节点
5.2.9 找到受影响的键
5.3 总结
6 设计键值存储系统
6.1 理解问题并确定设计的边界
6.2 单服务器的键值存储
6.3 分布式键值存储
6.3.1 CAP理论
6.3.2 系统组件
6.3.3 数据分区
6.3.4 数据复制
6.3.5 一致性
6.3.6 不一致性的解决方案:版本控制
6.3.7 处理故障
6.3.8 系统架构图
6.3.9 写路径
6.3.10 读路径
6.4 总结
7 设计分布式系统中的唯一ID生成器
7.1 第一步:理解问题并确定设计的边界
7.2 第二步:提议高层级的设计并获得认同
7.2.1 多主复制
7.2.2 UUID
7.2.3 工单服务器
7.2.4 推特的雪花系统
7.3 第三步:设计继续深入
7.4 第四步:总结
8 设计URL缩短器
8.1 第一步:理解问题并确定设计的边界
8.1.1 封底估算
8.2 第二步:提出高层级的设计并获得认同
8.2.1 API端点
8.2.2 URL重定向
8.2.3 缩短URL
8.3 第三步:设计继续深入
8.3.1 数据模型
8.3.2 哈希函数
8.3.3 深入探讨URL缩短流程
8.3.4 深入探讨URL重定向流程
8.4 第四步:总结
9 设计网络爬虫
9.1 第一步:理解问题并确定设计的边界
9.2 第二步:提议高层级的设计并获得认同
9.3 第三步:设计继续深入
9.3.1 DFS vs. BFS
9.3.2 URL前线
9.3.3 HTML下载器
9.3.4 健壮性
9.3.5 可扩展性
9.3.6 检测和避免有问题的内容
9.4 第四步:总结
10 设计通知系统
10.1 第一步:理解问题并确定设计的边界
10.2 第二步:提议高层级的设计并获得认同
10.2.1 不同类型的通知
10.2.2 联系信息的收集流程
10.2.3 通知的发送与接收流程
10.3 第三步:设计继续深入
10.3.1 可靠性
10.3.2 其他组件和要考虑的因素
10.3.3 更新后的设计
10.4 第四步:总结
11 设计news feed系统
11.1 第一步:理解问题并确定设计的边界
11.2 第二步:提议高层级的设计并获得认同
11.2.1 news feed API
11.2.2 feed的发布
11.2.3 news feed的构建
11.3 第三步:设计继续深入
11.3.1 深入探讨feed的发布流程
11.3.2 深入探讨news feed的获取流程
11.3.3 缓存架构
11.4 第四步:总结
12 设计聊天系统
12.1 第一步:理解问题并确定设计的边界
12.2 第二步:提议高层级的设计并获得认同
12.2.1 轮询
12.2.2 长轮询
12.2.3 WebSocket
12.2.4 高层级设计
12.2.5 数据模型
12.3 第三步:设计继续深入
12.3.1 服务发现
12.3.2 消息流
12.3.3 显示在线状态
12.4 第四步:总结
13 设计搜索自动补全系统
13.1 第一步:理解问题并确定设计的边界
13.1.1 封底估算
13.2 第二步:提议高层级的设计并获得认同
13.2.1 数据收集服务
13.2.2 查询服务
13.3 第三步:设计继续深入
13.3.1 字典树数据结构
13.3.2 数据收集服务
13.3.3 查询服务
13.3.4 字典树操作
13.3.5 扩展存储
13.4 第四步:总结
14 设计视频分享系统
14.1 第一步:理解问题并确定设计的边界
14.1.1 封底估算
14.2 第二步:提议高层级的设计并获得认同
14.2.1 视频上传流程
14.2.2 视频流式传输流程
14.3 第三步:设计继续深入
14.3.1 视频转码
14.3.2 有向无环图模型
14.3.3 视频转码架构
14.3.4 系统优化
14.3.5 错误处理
14.4 第四步:总结
15 设计云盘
15.1 第一步:理解问题并确定设计的边界
15.1.1 封底估算
15.2 第二步:提议高层级的设计并获得认同
15.2.1 API
15.2.2 跳出单服务器设计
15.2.3 同步冲突
15.2.4 高层级设计
15.3 第三步:设计继续深入
15.3.1 块服务器
15.3.2 高一致性需求
15.3.3 元数据数据库
15.3.4 上传流程
15.3.5 下载流程
15.3.6 通知服务
15.3.7 节约存储空间
15.3.8 故障处理
15.4 第四步:总结
16 设计支付系统
16.1 第一步:理解问题并确定设计的边界
16.2 第二步:提议高层级的设计并获得认同
16.2.1 收款流程
16.2.2 复式记账系统(Double-Entry System)
16.2.3 托管支付页面
16.2.4 付款流程
16.2.5 实时卖家仪表板
16.3 第三步:设计继续深入
16.3.1 重试和幂等
16.3.2 同步支付 vs. 异步支付
16.3.3 一致性
16.3.4 处理支付失败
16.3.5 支付安全
16.4 第四步:总结
17 设计指标监控和告警系统
17.1 第一步:理解问题并确定设计的边界
17.1.1 高层级需求
17.2 第二步:提议高层级的设计并获得认同
17.2.1 基本原理
17.2.2 数据模型
17.2.3 高层级设计
17.3 第三步:设计继续深入
17.3.1 指标数据的收集
17.3.2 扩展系统
17.3.3 查询服务
17.3.4 存储层
17.3.5 告警系统
17.3.6 可视化系统
17.4 第四步:总结
18 继续学习
后记
评论
还没有评论。