学习如何设计大型系统
学习如何设计可扩展的系统将会有助于你成为一个更好的工程师。
系统设计是一个很宽泛的话题。在互联网上,关于系统设计原则的资源也是多如牛毛。System-design-primer
这个仓库它可以帮助你学习如何构建可扩展的系统。
如何处理一个系统设计的面试题
在一场面试中你会被问到什么取决于下面这些因素:
- 你的经验
- 你的技术背景
- 你面试的职位
- 你面试的公司
- 运气
- 短期 - 以系统设计主题的广度为目标。通过解决一些面试题来练习。
- 中期 - 以系统设计主题的广度和初级深度为目标。通过解决很多面试题来练习。
- 长期 - 以系统设计主题的广度和高级深度为目标。通过解决大部分面试题来练习。
短期 | 中期 | 长期 | |
---|---|---|---|
阅读 系统设计主题 以获得一个关于系统如何工作的宽泛的认识 | 👍 | 👍 | 👍 |
阅读一些你要面试的公司工程博客的文章 | 👍 | 👍 | 👍 |
阅读 真实架构 | 👍 | 👍 | 👍 |
复习 如何处理一个系统设计面试题 | 👍 | 👍 | 👍 |
完成 系统设计的面试题和解答 | 一些 | 很多 | 大部分 |
完成 面向对象设计的面试题和解答 | 一些 | 很多 | 大部分 |
复习 其它的系统设计面试题 | 一些 | 很多 | 大部分 |
系统设计面试是一个开放式的对话
第一步:描述使用场景,约束和假设
- 谁会使用它?
- 他们会怎样使用它?
- 有多少用户?
- 系统的作用是什么?
- 系统的输入输出分别是什么?
- 我们希望处理多少数据?
- 我们希望每秒钟处理多少请求?
- 我们希望的读写比率?
第二步:创造一个高层级的设计
使用所有重要的组件来描绘出一个高层级的设计。
- 画出主要的组件和连接
- 证明你的想法
第三步:设计核心组件
对每一个核心组件进行详细深入的分析。举例来说,如果你被问到设计一个 url 缩写服务,开始讨论:
第四步:扩展设计
确认和处理瓶颈以及一些限制。举例来说就是你需要下面的这些来完成扩展性的议题吗?
- 负载均衡
- 水平扩展
- 缓存
- 数据库分片
相关资源和延伸阅读
查看下面的链接以获得我们期望的更好的想法: