- 原文地址:github.com/donnemartin/system-design-primer
- 译文出自:掘金翻译计划
- 译者:XatMassacrE、L9m、Airmacho、xiaoyusilen、jifaxu、根号三
- 这个 链接 用来查看本翻译与英文版是否有差别(如果你没有看到 README.md 发生变化,那就意味着这份翻译文档是最新的)。
English ∙ 日本語 ∙ 简体中文 ∙ 繁體中文 | العَرَبِيَّة ∙ বাংলা ∙ Português do Brasil ∙ Deutsch ∙ ελληνικά ∙ עברית ∙ Italiano ∙ 한국어 ∙ فارسی ∙ Polski ∙ русский язык ∙ Español ∙ ภาษาไทย ∙ Türkçe ∙ tiếng Việt ∙ Français | Add Translation

学习如何设计大型系统。
为系统设计的面试做准备。
学习如何设计可扩展的系统将会有助于你成为一个更好的工程师。
系统设计是一个很宽泛的话题。在互联网上,关于系统设计原则的资源也是多如牛毛。
这个仓库就是这些资源的组织收集,它可以帮助你学习如何构建可扩展的系统。
这是一个不断更新的开源项目的初期的版本。
欢迎贡献!
在很多科技公司中,除了代码面试,系统设计也是技术面试过程中的一个必要环节。
实践常见的系统设计面试题并且把你的答案和例子的解答进行对照:讨论,代码和图表。
面试准备的其他主题:

这里提供的抽认卡堆使用间隔重复的方法,帮助你记忆关键的系统设计概念。
随时随地都可使用。
你正在寻找资源以准备编程面试吗?

请查看我们的姐妹仓库互动式编程挑战,其中包含了一个额外的抽认卡堆:
从社区中学习。
欢迎提交 PR 提供帮助:
一些还需要完善的内容放在了正在完善中。
请查看贡献指南。
各种系统设计主题的摘要,包括优点和缺点。每一个主题都面临着取舍和权衡。
每个章节都包含着更多的资源的链接。

基于你面试的时间线(短、中、长)去复习那些推荐的主题。

问:对于面试来说,我需要知道这里的所有知识点吗?
答:不,如果只是为了准备面试的话,你并不需要知道所有的知识点。
在一场面试中你会被问到什么取决于下面这些因素:
那些有经验的候选人通常会被期望了解更多的系统设计的知识。架构师或者团队负责人则会被期望了解更多除了个人贡献之外的知识。顶级的科技公司通常也会有一次或者更多的系统设计面试。
面试会很宽泛的展开并在几个领域深入。这会帮助你了解一些关于系统设计的不同的主题。基于你的时间线,经验,面试的职位和面试的公司对下面的指导做出适当的调整。
| 短期 | 中期 | 长期 | |
|---|---|---|---|
| 阅读 系统设计主题 以获得一个关于系统如何工作的宽泛的认识 | :+1: | :+1: | :+1: |
| 阅读一些你要面试的公司工程博客的文章 | :+1: | :+1: | :+1: |
| 阅读 真实架构 | :+1: | :+1: | :+1: |
| 复习 如何处理一个系统设计面试题 | :+1: | :+1: | :+1: |
| 完成 系统设计的面试题和解答 | 一些 | 很多 | 大部分 |
| 完成 面向对象设计的面试题和解答 | 一些 | 很多 | 大部分 |
| 复习 其它的系统设计面试题 | 一些 | 很多 | 大部分 |
系统设计面试是一个开放式的对话。他们期望你去主导这个对话。
你可以使用下面的步骤来指引讨论。为了巩固这个过程,请使用下面的步骤完成系统设计的面试题和解答这个章节。
把所有需要的东西聚集在一起,审视问题。不停的提问,以至于我们可以明确使用场景和约束。讨论假设。
使用所有重要的组件来描绘出一个高层级的设计。
对每一个核心组件进行详细深入的分析。举例来说,如果你被问到设计一个 url 缩写服务,开始讨论:
确认和处理瓶颈以及一些限制。举例来说就是你需要下面的这些来完成扩展性的议题吗?
论述可能的解决办法和代价。每件事情需要取舍。可以使用可扩展系统的设计原则来处理瓶颈。
你或许会被要求通过手算进行一些估算。附录涉及到的是下面的这些资源:
查看下面的链接以获得我们期望的更好的想法:
普通的系统设计面试题和相关事例的论述,代码和图表。
与内容有关的解答在
solutions/文件夹中。
| 问题 | |
|---|---|
| 设计 Pastebin.com (或者 Bit.ly) | 解答 |
| 设计 Twitter 时间线和搜索 (或者 Facebook feed 和搜索) | 解答 |
| 设计一个网页爬虫 | 解答 |
| 设计 Mint.com | 解答 |
| 为一个社交网络设计数据结构 | 解答 |
| 为搜索引擎设计一个 key-value 储存 | 解答 |
| 通过分类特性设计 Amazon 的销售排名 | 解答 |
| 在 AWS 上设计一个百万用户级别的系统 | 解答 |
| 添加一个系统设计问题 | 贡献 |








常见面向对象设计面试问题及实例讨论,代码和图表演示。
与内容相关的解决方案在
solutions/文件夹中。注:此节还在完善中
| 问题 | |
|---|---|
| 设计 hash map | 解决方案 |
| 设计 LRU 缓存 | 解决方案 |
| 设计一个呼叫中心 | 解决方案 |
| 设计一副牌 | 解决方案 |
| 设计一个停车场 | 解决方案 |
| 设计一个聊天服务 | 解决方案 |
| 设计一个环形数组 | 待解决 |
| 添加一个面向对象设计问题 | 待解决 |
不熟悉系统设计?
首先,你需要对一般性原则有一个基本的认识,知道它们是什么,怎样使用以及利弊。
接下来,我们将看看高阶的权衡和取舍:
记住每个方面都面临取舍和权衡。
然后,我们将深入更具体的主题,如 DNS、CDN 和负载均衡器。
如果服务性能的增长与资源的增加是成比例的,服务就是可扩展的。通常,提高性能意味着服务于更多的工作单元,另一方面,当数据集增长时,同样也可以处理更大的工作单位。1
另一个角度来看待性能与可扩展性:
延迟是执行操作或运算结果所花费的时间。
吞吐量是单位时间内(执行)此类操作或运算的数量。
通常,你应该以可接受级延迟下最大化吞吐量为目标。

在一个分布式计算系统中,只能同时满足下列的两点:
网络并不可靠,所以你应要支持分区容错性,并需要在软件可用性和一致性间做出取舍。
等待分区节点的响应可能会导致延时错误。如果你的业务需求需要原子读写,CP 是一个不错的选择。
响应节点上可用数据的最近版本可能并不是最新的。当分区解析完后,写入(操作)可能需要一些时间来传播。
如果业务需求允许最终一致性,或当有外部故障时要求系统继续运行,AP 是一个不错的选择。
有同一份数据的多份副本,我们面临着怎样同步它们的选择,以便让客户端有一致的显示数据。回想 CAP 理论中的一致性定义 ─ 每次访问都能获得最新数据但可能会收到错误响应
在写入之后,访问可能看到,也可能看不到(写入数据)。尽力优化之让其能访问最新数据。
这种方式可以 memcached 等系统中看到。弱一致性在 VoIP,视频聊天和实时多人游戏等真实用例中表现不错。打个比方,如果你在通话中丢失信号几秒钟时间,当重新连接时你是听不到这几秒钟所说的话的。
在写入后,访问最终能看到写入数据(通常在数毫秒内)。数据被异步复制。
DNS 和 email 等系统使用的是此种方式。最终一致性在高可用性系统中效果不错。
在写入后,访问立即可见。数据被同步复制。
文件系统和关系型数据库(RDBMS)中使用的是此种方式。强一致性在需要记录的系统中运作良好。
$ claude mcp add system-design-primer \
-- python -m otcore.mcp_server <graph>