系统设计入门指南
动机
现在你可以学习如何设计大规模系统,为系统设计面试做准备。本指南包含的是一个有组织的资源集合,旨在帮助你了解如何构建可扩展的系统。
学习设计大规模系统
学习如何设计可扩展系统将帮助你成为更优秀的工程师。系统设计是一个广泛的话题,网络上有大量的资源分散在各处。这份指南整理了所有你所需的学习资源,帮助你系统化地学习。
系统设计面试准备
除了编码面试外,系统设计也是许多科技公司技术面试过程中的一个必要环节。你可以练习常见的系统设计面试问题,并将自己的结果与样本解决方案进行比较,包括讨论、代码和图表。
补充的面试准备主题包括:
- 学习指南
- 如何处理一个系统设计面试问题
- 系统设计面试问题及其解决方案
- 面向对象设计面试问题及其解决方案
Anki 卡片
提供的 Anki 卡片组 利用间隔重复的方式帮助你记住关键的系统设计概念。可以下载的卡片包括:
- 系统设计卡片
- 系统设计练习卡片
- 面向对象设计练习卡片
非常适合在外出时使用。
互动编码挑战资源
寻找帮助你为 编码面试 做准备的资源?
你可以查看姐妹库 互动编码挑战,该库包含一个额外的 Anki 卡片组:
- 编码卡片
系统设计主题索引
了解系统设计主题的良好开始是在多个主题间获得简明总结,包括它们的优缺点。每部分包含链接以获取更深入的研究资料。
以下是一些建议的学习步骤:
步骤1:回顾可扩展性视频讲座
可以从 哈佛的可扩展性讲座 开始。
覆盖的主题:
- 垂直扩展
- 水平扩展
- 缓存
- 负载均衡
- 数据库复制
- 数据库分区
步骤2:回顾可扩展性文章
阅读关于 可扩展性 的文章,了解更多。在该文章中你将学到:
- 克隆
- 数据库
- 缓存
- 异步
针对性能 VS 可扩展性、延迟 VS 吞吐量、可用性 VS 一致性等高层次的权衡将被详细讨论。
性能与可扩展性
一个服务是 可扩展的,如果分配的资源能有效提升 性能。通常增加性能意味着可以处理更多的工作单位,但也可能意味着处理更大的工作单位,例如,当数据集增加时。
性能和可扩展性的区别
- 如果你有 性能 问题,系统对单一用户依然速度缓慢。
- 如果你有 可扩展性 问题,系统对于单一用户速度正常,但在负载过重时变得缓慢。
有关 可扩展性 的理解。
延迟与吞吐量
延迟 是执行一些操作的时间或产生结果的时间。
吞吐量 是单位时间内完成的行动或产生的结果的数量。
你通常应该瞄准 最大吞吐量 和 可接受的延迟。
详细内容和内容
通过本文献继续理解延迟与吞吐量的关系。需要访问的链接包括:
- 延迟与吞吐量的理解
可用性与一致性
CAP 定理
来源:CAP 定理重审
在一个分布式计算系统中,你只可以保证下面两个特性中的任意两个:
- 一致性:每个读取操作接收到最近的写入或产生错误。
- 可用性:每个请求都接收到响应,但不能保证最新版本的信息。
- 分区容忍性:系统在因网络故障而导致的任意分区由于其子网仍然能继续操作。
网络并不可靠,因此你需要支持分区容忍性。在一致性和可用性之间需要进行软硬件的权衡。
发布的不同一致性模式和可用性模式将进一步详述。
同类项目
以下是一些与本项目类似的系统设计资源和工具:
- 系统设计速查表 - 提供快速转向常见系统设计概念的资源。
- LeetCode - 针对系统设计问题的一整套练习题库。
- Grokking the System Design Interview - 一门详细的在线课程,帮助你准备系统设计面试。
通过上述资源和工具,能够帮助您更好地理解和掌握系统设计的复杂性与实用性。