菜单

系统设计入门

相关源文件

系统设计入门指南 (System Design Primer) 是一个综合资源,旨在帮助软件工程师学习如何设计大规模系统并为系统设计面试做准备。本文档概述了该仓库的目的、结构和关键组成部分。

目的与范围

系统设计入门指南主要有以下两个目的:

  1. 学习资源:一个结构化的资源集合,帮助工程师理解和实现可扩展的系统设计。
  2. 面试准备:一份全面的指南,用于准备技术面试中的系统设计部分。

该仓库包含系统设计主题、实践示例、面试策略、常见系统设计问题的示例解决方案以及像抽认卡之类的额外资源。

有关面向对象设计面试准备,请参阅面向对象设计

存储库结构

系统设计入门指南仓库分为几个主要部分,如下所示:

来源: README.md1-91

学习指南

系统设计入门指南根据您的面试准备时间线提供不同的学习路径

时间线方法重点
短期广度阅读系统设计主题、公司工程博客,回顾真实世界架构,解决一些面试问题
中等广度 + 一些深度与短期时间线相同,外加解决许多面试问题
长期广度 + 更多深度与中期时间线相同,外加解决大多数面试问题

推荐的准备方法会根据您的可用时间和经验水平进行调整。通常期望经验更丰富的候选人对系统设计有更深入的了解。

来源: README.md181-217

系统设计面试方法

系统设计面试是一种开放式对话,您需要在其中主导讨论。以下四步法提供了一种结构化的方法来应对系统设计面试问题:

步骤 1:概述用例、约束和假设

  • 收集需求并明确问题范围
  • 提出关于用例和限制的澄清问题
  • 确定关键指标:用户数、数据量、每秒请求数、读写比例

步骤 2:创建高层设计

  • 绘制主要组件和连接图
  • 论证您的架构选择

步骤 3:设计核心组件

  • 深入探讨每个核心组件的细节
  • 涵盖数据结构、算法和存储方法
  • 讨论API和接口设计

步骤 4:扩展设计

  • 识别并解决瓶颈
  • 应用可扩展性原则
  • 权衡不同解决方案的利弊

来源: README.md218-286

系统设计主题

系统设计入门指南涵盖了设计可扩展系统所必需的广泛主题。这些主题相互关联并层层递进,如下所示:

基本概念

  • 性能与可扩展性:如果服务在添加资源后其性能能按比例提升,则该服务是可扩展的
  • 延迟与吞吐量:延迟是执行一项操作所需的时间,吞吐量是单位时间内执行操作的数量
  • CAP 定理:在分布式系统中,您只能支持以下三项中的两项:一致性 (Consistency)、可用性 (Availability) 和分区容错性 (Partition Tolerance)

可扩展系统的构建块

  • 网络组件:DNS、CDN、负载均衡器和反向代理
  • 应用程序架构:微服务、服务发现和API设计
  • 数据管理:数据库选择、缓存策略、数据复制和分片
  • 异步处理:用于后台处理的消息队列和任务队列

来源: README.md90-180 README.md372-411

系统设计解决方案

该仓库提供了常见系统设计面试问题的详细解析,包括:

系统设计示例涵盖的关键概念
Pastebin / Bit.lyURL缩短、哈希函数、数据库存储
Twitter时间线信息流生成、扇出、缓存策略
网络爬虫分布式处理、URL前沿、礼貌性
Mint.com金融数据聚合、安全性、数据处理
社交图谱图数据库、关系建模、遍历
键值存储分布式存储、一致性、分区
销售排名实时分析、聚合、缓存
在 AWS 上进行扩展云基础设施、微服务、弹性

每个解决方案都包括讨论、图表和实现注意事项,以帮助理解设计过程。

来源: README.md287-352

面向对象设计

该仓库还涵盖了面向对象设计示例,包括:

  • LRU缓存实现
  • 扑克牌组设计
  • 呼叫中心系统
  • 停车场管理
  • 在线聊天应用程序

这些示例侧重于类结构、继承、封装以及设计模式的应用。

来源: README.md353-371

资源

Anki 抽认卡

系统设计入门指南包含 Anki 抽认卡牌组,以帮助记忆关键概念

  • 系统设计牌组:核心系统设计概念
  • 系统设计练习牌组:练习题
  • 面向对象设计练习牌组:面向对象设计练习

这些抽认卡利用间隔重复来巩固学习,并专为随时随地学习而设计。

其他资源

该仓库还提供:

  • 供快速查阅的二的幂次表
  • 每个程序员都应该知道的延迟数值
  • 公司工程博客链接
  • 真实世界架构参考

来源: README.md46-73 README.md1579-1598 README.md1599-1636 README.md1747-1798

贡献

系统设计入门指南是一个开源项目,欢迎以各种形式的贡献:

  • 修正错误
  • 改进现有部分
  • 添加新部分
  • 将内容翻译成其他语言

贡献者可以帮助完善需要改进的内容,这些内容在仓库中被标记为“开发中”。

来源: README.md74-87 README.md1800-1808