donnemartin /system-design-primer

Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards.

★ 377,510⑂ 59,254👁 6,899⑃ 752● 416▤ 0◈ 0
PythonNOASSERTIONCreated 2017-02-26
377,510
stars
+121
59,254
forks
6,899
watchers
752
prs
416
issues
0
releases
0
discussions

README

原文地址: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 提供帮助:

 修复错误
 完善章节
 添加章节
 帮助翻译

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

请查看贡献指南。

 系统设计主题的索引

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

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



  
  


 系统设计主题:从这里开始
     第一步:回顾可扩展性的视频讲座
     第二步:回顾可扩展性的文章
     接下来的步骤
 性能与拓展性
 延迟与吞吐量
 可用性与一致性
     CAP 理论
         CP - 一致性和分区容错性
         AP - 可用性和分区容错性
 一致模式
     弱一致性
     最终一致性
     强一致性
 可用模式
     故障切换
     复制
 域名系统
 CDN
     CDN 推送
     CDN 拉取
 负载均衡器
     工作到备用切换(Active-passive)
     双工作切换(Active-active)
     四层负载均衡
     七层负载均衡
     水平扩展
 反向代理(web 服务器)
     负载均衡与反向代理
 应用层
     微服务
     服务发现
 数据库
     关系型数据库管理系统(RDBMS)
         Master-slave 复制集
         Master-master 复制集
         联合
         分片
         非规范化
         SQL 调优
     NoSQL
         Key-value 存储
         文档存储
         宽列存储
         图数据库
     SQL 还是 NoSQL
 缓存
     客户端缓存
     CDN 缓存
     Web 服务器缓存
     数据库缓存
     应用缓存
     数据库查询级别的缓存
     对象级别的缓存
     何时更新缓存
         缓存模式
         直写模式
         回写模式
         刷新
 异步
     消息队列
     任务队列
     背压机制
 通讯
     传输控制协议(TCP)
     用户数据报协议(UDP)
     远程控制调用协议(RPC)
     表述性状态转移(REST)
 安全
 附录
     2 的次方表
     每个程序员都应该知道的延迟数
     其它的系统设计面试题
     真实架构
     公司的系统架构
     公司工程博客
 正在完善中
 致谢
 联系方式
 许可

 学习指引

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

!Imgur

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

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

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

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

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

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

 短期 - 以系统设计主题的广度为目标。通过解决一些面试题来练习。
 中期 - 以系统设计主题的广度和初级深度为目标。通过解决很多面试题来练习。
 长期 - 以系统设计主题的广度和高级深度为目标。通过解决大部分面试题来练习。

|                                          | 短期   | 中期   | 长期   |
| ---------------------------------------- | ---- | ---- | ---- |
| 阅读 系统设计主题 以获得一个关于系统如何工作的宽泛的认识 | :+1: | :+1: | :+1: |
| 阅读一些你要面试的公司工程博客的文章            | :+1: | :+1: | :+1: |
| 阅读 真实架构                   | :+1: | :+1: | :+1: |
| 复习 如何处理一个系统设计面试题       | :+1: | :+1: | :+1: |
| 完成 系统设计的面试题和解答             | 一些   | 很多   | 大部分  |
| 完成 面向对象设计的面试题和解答   

Top issues

Snapshot: 2026-11-10T09:35:25Z · Data license Apache-2.0 · JSON