新書推薦:
《
日耳曼通识译丛:复原力:心理抗逆力
》
售價:NT$
155.0
《
海外中国研究·未竟之业:近代中国的言行表率
》
售價:NT$
614.0
《
我们为何建造(城市与生态文明丛书)
》
售價:NT$
406.0
《
算法经济 : 商业逻辑与人类生活的智能演进(生动呈现AI与算法的创新应用与商业价值)
》
售價:NT$
359.0
《
家书中的百年史
》
售價:NT$
359.0
《
偏爱月亮
》
售價:NT$
207.0
《
生物安全与环境
》
售價:NT$
255.0
《
泥土:文明的侵蚀(城市与生态文明丛书)
》
售價:NT$
380.0
內容簡介:
系统设计面试被认为是所有技术面试中难度最大的面试,因为面试题的范围都非常广且模糊,其答案也是开放的,不存在标准答案或正确答案。本书是专门为准备系统设计面试的读者而撰写的,重点讨论了分布式系统中的常用组件和大型Web应用的系统架构,涵盖了几类常见的典型应用,包括聊天系统、视频流系统、文件存储系统(云盘)、支付系统等,旨在帮助读者掌握构建一个可扩展的系统所需的基础知识,为面试做好充分准备。作为过来人,作者提出了应对面试题的“四步法”,即确定问题范围→总体设计→细节设计→总结,书中的案例基本上都是按照这个步骤进行解析的。这种解题框架有助于在面试时搞清楚系统的需求、限制和瓶颈,理清思路,有条不紊地作答。通过本书,读者可以了解不同Web应用的系统设计方案的要点及采用的技术,据此查漏补缺,补齐自己知识体系中的短板,为面试成功增添更多的可能。而对于已经是架构师的读者而言,书中的案例将为他们提供新的思路和灵感,有助于他们在面试中更加从容地展现自己的设计思路和实践经验。
關於作者:
Alex Xu,卡耐基梅隆大学硕士,他是一位经验丰富的软件工程师,也是一个创业者。他曾在Twitter、苹果和Zynga等公司工作。他热衷于设计和实现复杂的系统。徐江,毕业于瑞典皇家理工学院的系统生物学专业,曾就职于Thoughtworks软件技术有限公司,现在在宝洁公司担任IT service manager,负责consumer relations。
目錄 :
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 UUID7.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 缩短URL8.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. BFS9.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 API11.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 WebSocket12.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 API15.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 继续学习后记