请点击下文链接查看详细,本文章只是一个目录,具体内容去原文查看
- 原文地址:github.com/donnemartin/system-design-primer
- 译文出自:掘金翻译计划
- 译者:XatMassacrE、L9m、Airmacho、xiaoyusilen、jifaxu
- 这个 链接 用来查看本翻译与英文版是否有差别(如果你没有看到 README.md 发生变化,那就意味着这份翻译文档是最新的)。
系统设计入门
<p align="center"> <img src="http://i.imgur.com/jj3A5N8.png"> </p>
目的
学习如何设计大型系统。 为系统设计的面试做准备。
学习如何设计大型系统
学习如何设计可扩展的系统将会有助于你成为一个更好的工程师。
系统设计是一个很宽泛的话题。在互联网上,关于系统设计原则的资源也是多如牛毛。
这个仓库就是这些资源的组织收集,它可以帮助你学习如何构建可扩展的系统。
从开源社区学习
这是一个不断更新的开源项目的初期的版本。
欢迎贡献!
为系统设计的面试做准备
在很多科技公司中,除了代码面试,系统设计也是技术面试过程中的一个必要环节。
实践常见的系统设计面试题并且把你的答案和例子的解答进行对照:讨论,代码和图表。
面试准备的其他主题:
- 学习指引
- 如何处理一个系统设计的面试题
- 系统设计的面试题,含解答
- 面向对象设计的面试题,含解答
- 其它的系统设计面试题
抽认卡
<p align="center"> <img src="http://i.imgur.com/zdCAkB3.png"> </p>
这里提供的抽认卡堆使用间隔重复的方法,帮助你记忆关键的系统设计概念。
- 系统设计的卡堆
- 系统设计的练习卡堆
- 面向对象设计的练习卡堆
随时随地都可使用。
代码资源:互动式编程挑战
你正在寻找资源以准备编程面试吗?
<p align="center"> <img src="http://i.imgur.com/b4YtAEN.png"> </p>
请查看我们的姐妹仓库互动式编程挑战,其中包含了一个额外的抽认卡堆:
- 代码卡堆
贡献
从社区中学习。
欢迎提交 PR 提供帮助:
- 修复错误
- 完善章节
- 添加章节
一些还需要完善的内容放在了正在完善中。
请查看贡献指南。
系统设计主题的索引
各种系统设计主题的摘要,包括优点和缺点。每一个主题都面临着取舍和权衡。 每个章节都包含着更多的资源的链接。
<p align="center"> <img src="http://i.imgur.com/jrUBAF7.png"> </p>
- 系统设计主题:从这里开始
- 第一步:回顾可扩展性的视频讲座
- 第二步:回顾可扩展性的文章
- 接下来的步骤
- 性能与拓展性
- 延迟与吞吐量
- 可用性与一致性
- CAP 理论
- CP - 一致性和分区容错性
- AP - 可用性和分区容错性
- CAP 理论
- 一致模式
- 弱一致性
- 最终一致性
- 强一致性
- 可用模式
- 故障切换
- 复制
- 域名系统
- CDN
- CDN 推送
- CDN 拉取
- 负载均衡器
- 工作到备用切换(Active-passive)
- 双工作切换(Active-active)
- 四层负载均衡
- 七层负载均衡
- 水平扩展
- 反向代理(web 服务器)
- 负载均衡与反向代理
- 应用层
- 微服务
- 服务发现
- 数据库
- 关系型数据库管理系统(RDBMS)
- Master-slave 复制集
- Master-master 复制集
- 联合
- 分片
- 非规范化
- SQL 调优
- NoSQL
- Key-value 存储
- 文档存储
- 宽列存储
- 图数据库
- SQL 还是 NoSQL
- 关系型数据库管理系统(RDBMS)
- 缓存
- 客户端缓存
- CDN 缓存
- Web 服务器缓存
- 数据库缓存
- 应用缓存
- 数据库查询级别的缓存
- 对象级别的缓存
- 何时更新缓存
- 缓存模式
- 直写模式
- 回写模式
- 刷新
- 异步
- 消息队列
- 任务队列
- 背压机制
- 通讯
- 传输控制协议(TCP)
- 用户数据报协议(UDP)
- 远程控制调用协议(RPC)
- 表述性状态转移(REST)
- 安全
- 附录
- 2 的次方表
- 每个程序员都应该知道的延迟数
- 其它的系统设计面试题
- 真实架构
- 公司的系统架构
- 公司工程博客
- 正在完善中
- 致谢
- 联系方式
- 许可
学习指引
基于你面试的时间线(短、中、长)去复习那些推荐的主题。
Imgur
问:对于面试来说,我需要知道这里的所有知识点吗?
答:不,如果只是为了准备面试的话,你并不需要知道所有的知识点。
在一场面试中你会被问到什么取决于下面这些因素:
- 你的经验
- 你的技术背景
- 你面试的职位
- 你面试的公司
- 运气
那些有经验的候选人通常会被期望了解更多的系统设计的知识。架构师或者团队负责人则会被期望了解更多除了个人贡献之外的知识。顶级的科技公司通常也会有一次或者更多的系统设计面试。
面试会很宽泛的展开并在几个领域深入。这会帮助你了解一些关于系统设计的不同的主题。基于你的时间线,经验,面试的职位和面试的公司对下面的指导做出适当的调整。
- 短期 - 以系统设计主题的广度为目标。通过解决一些面试题来练习。
- 中期 - 以系统设计主题的广度和初级深度为目标。通过解决很多面试题来练习。
- 长期 - 以系统设计主题的广度和高级深度为目标。通过解决大部分面试题来练习。
短期 | 中期 | 长期 | |
---|---|---|---|
阅读 系统设计主题 以获得一个关于系统如何工作的宽泛的认识 | : 1: | : 1: | : 1: |
阅读一些你要面试的公司工程博客的文章 | : 1: | : 1: | : 1: |
阅读 真实架构 | : 1: | : 1: | : 1: |
复习 如何处理一个系统设计面试题 | : 1: | : 1: | : 1: |
完成 系统设计的面试题和解答 | 一些 | 很多 | 大部分 |
完成 面向对象设计的面试题和解答 | 一些 | 很多 | 大部分 |
复习 其它的系统设计面试题 | 一些 | 很多 | 大部分 |
如何处理一个系统设计的面试题
系统设计面试是一个开放式的对话。他们期望你去主导这个对话。
你可以使用下面的步骤来指引讨论。为了巩固这个过程,请使用下面的步骤完成系统设计的面试题和解答这个章节。
第一步:描述使用场景,约束和假设
把所有需要的东西聚集在一起,审视问题。不停的提问,以至于我们可以明确使用场景和约束。讨论假设。
- 谁会使用它?
- 他们会怎样使用它?
- 有多少用户?
- 系统的作用是什么?
- 系统的输入输出分别是什么?
- 我们希望处理多少数据?
- 我们希望每秒钟处理多少请求?
- 我们希望的读写比率?
第二步:创造一个高层级的设计
使用所有重要的组件来描绘出一个高层级的设计。
- 画出主要的组件和连接
- 证明你的想法
第三步:设计核心组件
对每一个核心组件进行详细深入的分析。举例来说,如果你被问到设计一个 url 缩写服务,开始讨论:
- 生成并储存一个完整 url 的 hash
- MD5 和 Base62
- Hash 碰撞
- SQL 还是 NoSQL
- 数据库模型
- 将一个 hashed url 翻译成完整的 url
- 数据库查找
- API 和面向对象设计
第四步:扩展设计
确认和处理瓶颈以及一些限制。举例来说就是你需要下面的这些来完成扩展性的议题吗?
- 负载均衡
- 水平扩展
- 缓存
- 数据库分片
论述可能的解决办法和代价。每件事情需要取舍。可以使用可扩展系统的设计原则来处理瓶颈。
预估计算量
你或许会被要求通过手算进行一些估算。附录涉及到的是下面的这些资源:
- 使用预估计算量
- 2 的次方表
- 每个程序员都应该知道的延迟数
相关资源和延伸阅读
查看下面的链接以获得我们期望的更好的想法:
- 怎样通过一个系统设计的面试
- 系统设计的面试
- 系统架构与设计的面试简介
系统设计的面试题和解答
普通的系统设计面试题和相关事例的论述,代码和图表。
与内容有关的解答在
solutions/
文件夹中。
问题 | |
---|---|
设计 Pastebin.com (或者 Bit.ly) | 解答 |
设计 Twitter 时间线和搜索 (或者 Facebook feed 和搜索) | 解答 |
设计一个网页爬虫 | 解答 |
设计 Mint.com | 解答 |
为一个社交网络设计数据结构 | 解答 |
为搜索引擎设计一个 key-value 储存 | 解答 |
通过分类特性设计 Amazon 的销售排名 | 解答 |
在 AWS 上设计一个百万用户级别的系统 | 解答 |
添加一个系统设计问题 | 贡献 |
设计 Pastebin.com (或者 Bit.ly)
查看实践与解答
Imgur
设计 Twitter 时间线和搜索 (或者 Facebook feed 和搜索)
查看实践与解答
Imgur
设计一个网页爬虫
查看实践与解答
Imgur
设计 Mint.com
查看实践与解答
Imgur
为一个社交网络设计数据结构
查看实践与解答
Imgur
为搜索引擎设计一个 key-value 储存
查看实践与解答
Imgur
设计按类别分类的 Amazon 销售排名
查看实践与解答
Imgur
在 AWS 上设计一个百万用户级别的系统
查看实践与解答
Imgur