MCPcopy
hub / github.com/donnemartin/system-design-primer

github.com/donnemartin/system-design-primer @main sqlite

repository ↗ · DeepWiki ↗
202 symbols 303 edges 26 files 33 documented · 16%
README

English日本語简体中文繁體中文 | العَرَبِيَّة‎বাংলাPortuguês do BrasilDeutschελληνικάעבריתItaliano한국어فارسیPolskiрусский языкEspañolภาษาไทยTürkçetiếng ViệtFrançais | Add Translation

系统设计入门

目的

学习如何设计大型系统。

为系统设计的面试做准备。

学习如何设计大型系统

学习如何设计可扩展的系统将会有助于你成为一个更好的工程师。

系统设计是一个很宽泛的话题。在互联网上,关于系统设计原则的资源也是多如牛毛。

这个仓库就是这些资源的组织收集,它可以帮助你学习如何构建可扩展的系统。

从开源社区学习

这是一个不断更新的开源项目的初期的版本。

欢迎贡献

为系统设计的面试做准备

在很多科技公司中,除了代码面试,系统设计也是技术面试过程中的一个必要环节

实践常见的系统设计面试题并且把你的答案和例子的解答进行对照:讨论,代码和图表。

面试准备的其他主题:

抽认卡

这里提供的抽认卡堆使用间隔重复的方法,帮助你记忆关键的系统设计概念。

随时随地都可使用。

代码资源:互动式编程挑战

你正在寻找资源以准备编程面试吗?

请查看我们的姐妹仓库互动式编程挑战,其中包含了一个额外的抽认卡堆:

贡献

从社区中学习。

欢迎提交 PR 提供帮助:

一些还需要完善的内容放在了正在完善中

请查看贡献指南

系统设计主题的索引

各种系统设计主题的摘要,包括优点和缺点。每一个主题都面临着取舍和权衡

每个章节都包含着更多的资源的链接。

学习指引

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

Imgur

问:对于面试来说,我需要知道这里的所有知识点吗?

答:不,如果只是为了准备面试的话,你并不需要知道所有的知识点。

在一场面试中你会被问到什么取决于下面这些因素:

  • 你的经验
  • 你的技术背景
  • 你面试的职位
  • 你面试的公司
  • 运气

那些有经验的候选人通常会被期望了解更多的系统设计的知识。架构师或者团队负责人则会被期望了解更多除了个人贡献之外的知识。顶级的科技公司通常也会有一次或者更多的系统设计面试。

面试会很宽泛的展开并在几个领域深入。这会帮助你了解一些关于系统设计的不同的主题。基于你的时间线,经验,面试的职位和面试的公司对下面的指导做出适当的调整。

  • 短期 - 以系统设计主题的广度为目标。通过解决一些面试题来练习。
  • 中期 - 以系统设计主题的广度初级深度为目标。通过解决很多面试题来练习。
  • 长期 - 以系统设计主题的广度高级深度为目标。通过解决大部分面试题来练习。
短期 中期 长期
阅读 系统设计主题 以获得一个关于系统如何工作的宽泛的认识 :+1: :+1: :+1:
阅读一些你要面试的公司工程博客的文章 :+1: :+1: :+1:
阅读 真实架构 :+1: :+1: :+1:
复习 如何处理一个系统设计面试题 :+1: :+1: :+1:
完成 系统设计的面试题和解答 一些 很多 大部分
完成 面向对象设计的面试题和解答 一些 很多 大部分
复习 其它的系统设计面试题 一些 很多 大部分

如何处理一个系统设计的面试题

系统设计面试是一个开放式的对话。他们期望你去主导这个对话。

你可以使用下面的步骤来指引讨论。为了巩固这个过程,请使用下面的步骤完成系统设计的面试题和解答这个章节。

第一步:描述使用场景,约束和假设

把所有需要的东西聚集在一起,审视问题。不停的提问,以至于我们可以明确使用场景和约束。讨论假设。

  • 谁会使用它?
  • 他们会怎样使用它?
  • 有多少用户?
  • 系统的作用是什么?
  • 系统的输入输出分别是什么?
  • 我们希望处理多少数据?
  • 我们希望每秒钟处理多少请求?
  • 我们希望的读写比率?

第二步:创造一个高层级的设计

使用所有重要的组件来描绘出一个高层级的设计。

  • 画出主要的组件和连接
  • 证明你的想法

第三步:设计核心组件

对每一个核心组件进行详细深入的分析。举例来说,如果你被问到设计一个 url 缩写服务,开始讨论:

  • 生成并储存一个完整 url 的 hash
    • MD5Base62
    • Hash 碰撞
    • SQL 还是 NoSQL
    • 数据库模型
  • 将一个 hashed url 翻译成完整的 url
    • 数据库查找
  • API 和面向对象设计

第四步:扩展设计

确认和处理瓶颈以及一些限制。举例来说就是你需要下面的这些来完成扩展性的议题吗?

  • 负载均衡
  • 水平扩展
  • 缓存
  • 数据库分片

论述可能的解决办法和代价。每件事情需要取舍。可以使用可扩展系统的设计原则来处理瓶颈。

预估计算量

你或许会被要求通过手算进行一些估算。附录涉及到的是下面的这些资源:

相关资源和延伸阅读

查看下面的链接以获得我们期望的更好的想法:

系统设计的面试题和解答

普通的系统设计面试题和相关事例的论述,代码和图表。

与内容有关的解答在 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

面向对象设计的面试问题及解答

常见面向对象设计面试问题及实例讨论,代码和图表演示。

与内容相关的解决方案在 solutions/ 文件夹中。

注:此节还在完善中

问题
设计 hash map 解决方案
设计 LRU 缓存 解决方案
设计一个呼叫中心 解决方案
设计一副牌 解决方案
设计一个停车场 解决方案
设计一个聊天服务 解决方案
设计一个环形数组 待解决
添加一个面向对象设计问题 待解决

系统设计主题:从这里开始

不熟悉系统设计?

首先,你需要对一般性原则有一个基本的认识,知道它们是什么,怎样使用以及利弊。

第一步:回顾可扩展性(scalability)的视频讲座

哈佛大学可扩展性讲座

  • 主题涵盖
    • 垂直扩展(Vertical scaling)
    • 水平扩展(Horizontal scaling)
    • 缓存
    • 负载均衡
    • 数据库复制
    • 数据库分区

第二步:回顾可扩展性文章

可扩展性

接下来的步骤

接下来,我们将看看高阶的权衡和取舍:

  • 性能可扩展性
  • 延迟吞吐量
  • 可用性一致性

记住每个方面都面临取舍和权衡

然后,我们将深入更具体的主题,如 DNS、CDN 和负载均衡器。

性能与可扩展性

如果服务性能的增长与资源的增加是成比例的,服务就是可扩展的。通常,提高性能意味着服务于更多的工作单元,另一方面,当数据集增长时,同样也可以处理更大的工作单位。1

另一个角度来看待性能与可扩展性:

  • 如果你的系统有性能问题,对于单个用户来说是缓慢的。
  • 如果你的系统有可扩展性问题,单个用户较快但在高负载下会变慢。

来源及延伸阅读

延迟与吞吐量

延迟是执行操作或运算结果所花费的时间。

吞吐量是单位时间内(执行)此类操作或运算的数量。

通常,你应该以可接受级延迟最大化吞吐量为目标。

来源及延伸阅读

可用性与一致性

CAP 理论

来源:再看 CAP 理论

在一个分布式计算系统中,只能同时满足下列的两点:

  • 一致性 ─ 每次访问都能获得最新数据但可能会收到错误响应
  • 可用性 ─ 每次访问都能收到非错响应,但不保证获取到最新数据
  • 分区容错性 ─ 在任意分区网络故障的情况下系统仍能继续运行

网络并不可靠,所以你应要支持分区容错性,并需要在软件可用性和一致性间做出取舍。

CP ─ 一致性和分区容错性

等待分区节点的响应可能会导致延时错误。如果你的业务需求需要原子读写,CP 是一个不错的选择。

AP ─ 可用性与分区容错性

响应节点上可用数据的最近版本可能并不是最新的。当分区解析完后,写入(操作)可能需要一些时间来传播。

如果业务需求允许最终一致性,或当有外部故障时要求系统继续运行,AP 是一个不错的选择。

来源及延伸阅读

一致性模式

有同一份数据的多份副本,我们面临着怎样同步它们的选择,以便让客户端有一致的显示数据。回想 CAP 理论中的一致性定义 ─ 每次访问都能获得最新数据但可能会收到错误响应

弱一致性

在写入之后,访问可能看到,也可能看不到(写入数据)。尽力优化之让其能访问最新数据。

这种方式可以 memcached 等系统中看到。弱一致性在 VoIP,视频聊天和实时多人游戏等真实用例中表现不错。打个比方,如果你在通话中丢失信号几秒钟时间,当重新连接时你是听不到这几秒钟所说的话的。

最终一致性

在写入后,访问最终能看到写入数据(通常在数毫秒内)。数据被异步复制。

DNS 和 email 等系统使用的是此种方式。最终一致性在高可用性系统中效果不错。

强一致性

在写入后,访问立即可见。数据被同步复制。

文件系统和关系型数据库(RDBMS)中使用的是此种方式。强一致性在需要记录的系统中运作良好。

来源及延伸阅读

  • [Tran

Core symbols most depended-on inside this repo

_dispatch_call
called by 3
solutions/object_oriented_design/call_center/call_center.py
_hash_function
called by 3
solutions/object_oriented_design/hash_table/hash_map.py
move_to_front
called by 2
solutions/system_design/query_cache/query_cache_snippets.py
extract_max_priority_page
called by 2
solutions/system_design/web_crawler/web_crawler_snippets.py
_escalate_call
called by 2
solutions/object_oriented_design/call_center/call_center.py
move_to_front
called by 2
solutions/object_oriented_design/lru_cache/lru_cache.py
extract_url
called by 1
solutions/system_design/pastebin/pastebin.py
extract_year_month
called by 1
solutions/system_design/pastebin/pastebin.py

Shape

Method 146
Class 56

Languages

Python100%

Modules by API surface

solutions/object_oriented_design/parking_lot/parking_lot.py30 symbols
solutions/object_oriented_design/online_chat/online_chat.py27 symbols
solutions/object_oriented_design/call_center/call_center.py26 symbols
solutions/object_oriented_design/deck_of_cards/deck_of_cards.py22 symbols
solutions/system_design/web_crawler/web_crawler_snippets.py15 symbols
solutions/system_design/query_cache/query_cache_snippets.py15 symbols
solutions/system_design/social_graph/social_graph_snippets.py14 symbols
solutions/object_oriented_design/lru_cache/lru_cache.py11 symbols
solutions/system_design/mint/mint_snippets.py9 symbols
solutions/system_design/mint/mint_mapreduce.py8 symbols
solutions/object_oriented_design/hash_table/hash_map.py8 symbols
solutions/system_design/sales_rank/sales_rank_mapreduce.py7 symbols

For agents

$ claude mcp add system-design-primer \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact