系统设计入门

donnemartin/system-design-primer 访问 GitHub ↗
🔤 Python ★ 362708 ⑂ 0 weekly #18 (+2724) 抓取 2026-08-10

一句话简介

面向软件工程师的系统设计学习资源,涵盖可扩展架构、负载均衡、缓存、数据库等核心概念,配有大量图表与真实案例。

标签

  • 系统设计
  • 可扩展架构
  • 后端开发
  • 面试准备
  • 分布式系统

适用应用场景

  • 技术面试复习
  • 构建高可用后端服务
  • 学习分布式系统架构
  • 团队技术培训参考

README 中文摘要

系统设计入门

项目动机

学习如何设计大规模分布式系统。掌握可扩展系统设计是工程师进阶的核心能力,也是众多科技公司技术面试中的必考环节。

本项目是一份持续更新的开源资源合集,致力于解决"系统设计资料散落各处、缺乏体系"的问题。内容涵盖原理、面试题解答、代码与架构图,欢迎通过 Pull Request 参与贡献。

Anki 记忆卡片

基于间隔重复算法,提供以下 Anki 卡组,帮助在通勤等碎片时间巩固关键概念:

  • 系统设计卡组
  • 系统设计练习卡组
  • 面向对象设计练习卡组

系统设计主题索引

文档按以下结构组织,每个章节附有深入阅读链接:

起步

  • 第 1 步:观看哈佛可扩展性讲座视频
  • 第 2 步:阅读 Scalability 系列文章
  • 接下来:理解核心权衡

核心权衡

  • 性能 vs 可扩展性:性能问题表现为单用户体验慢;可扩展性问题表现为单用户快但高负载下变慢。
  • 延迟 vs 吞吐量:目标是"可接受延迟下的最大吞吐量"。
  • 可用性 vs 一致性:CAP 定理指出分布式系统只能在一致性、可用性、分区容错性中三选二;由于网络不可靠,分区容错必须支持,因此需在一致性与可用性之间取舍。
    • CP 系统:等待分区节点响应可能超时,适合需要原子读写的事务场景。
    • AP 系统:返回任意节点上的可用版本,适合允许最终一致性的业务。

一致性模式

  • 弱一致性:写入后读可能看不到,典型如 memcached,适合 VoIP、视频通话等实时场景。
  • 最终一致性:写入后读最终能看到(通常毫秒级),典型如 DNS、邮件。
  • 强一致性:写入后读立即看到,数据同步复制,典型如 RDBMS、文件系统。

可用性模式

  • 故障转移:分为主-备(Active-Passive,通过心跳切换)和主-主(Active-Active,双机同时承载流量)。代价是增加硬件复杂度,且主节点故障时未复制的数据可能丢失。
  • 复制:与数据库章节的主从、主主复制配合使用。
  • 可用性数值:业界常用"几个 9"衡量,例如 99.99%(四个 9)每年允许 downtime 约 52 分 35 秒。
    • 串联组件:总可用性 = A(Foo) × A(Bar)
    • 并联组件:总可用性 = 1 − (1 − A(Foo)) × (1 − A(Bar))

关键基础设施组件

DNS(域名系统)

将域名解析为 IP 地址,采用分层结构。常见记录类型包括 NS、MX、A、CNAME。CloudFlare、Route 53 等托管 DNS 服务支持加权轮询、基于延迟、基于地理位置的路由策略。

缺点:解析引入轻微延迟;管理复杂;历史上曾遭受 DDoS 攻击。

CDN(内容分发网络)

全球分布的代理服务器集群,让用户就近获取静态资源(HTML/CSS/JS、图片、视频)。部分 CDN(如 CloudFront)也支持动态内容。

  • Push CDN:内容变更时主动推送至 CDN,适合访问量稳定的资源。
  • Pull CDN:首次访问时按需回源拉取,适合访问量较低的站点。

负载均衡器

  • Active-Passive:仅主节点处理流量,备节点待命。
  • Active-Active:多节点同时分担流量。
  • 四层负载均衡:基于网络层信息(IP、端口)转发。
  • 七层负载均衡:基于应用层内容(HTTP 头、URL)转发,可实现缓存、SSL 卸载等高级策略。
  • 水平扩展:通过增加机器数量提升吞吐能力。

反向代理(Web 服务器)

位于客户端与真实服务器之间,承担缓存、SSL 卸载、请求过滤、动静分离等职责。与负载均衡的区别在于:反向代理侧重单个应用的请求处理,负载均衡侧重跨多个后端的流量分配。

学习路径建议

根据面试准备时间选择深度:

准备时长 策略
短期 广度优先,做少量练习题
中期 广度 + 部分深度,做大量练习题
长期 广度 + 深度,做大部分练习题

无论时间长短,都建议通读系统设计主题、浏览目标公司工程博客与真实架构案例、复习面试答题方法。

面试答题方法论

系统设计面试是开放对话,候选人应主动引导讨论。建议四步法:

第 1 步:梳理用例、约束与假设

明确用户、规模、读写比例、数据量、QPS 等关键问题,划定讨论边界。

第 2 步:高层设计

画出主要组件与连接关系,解释设计理由。

第 3 步:设计核心组件

针对每个组件深入展开。以"短链接服务"为例:需讨论哈希生成(MD5、Base62)、冲突处理、SQL/NoSQL 选择、数据表设计、API 与面向对象设计。

第 4 步:扩展性设计

识别瓶颈,引入负载均衡、水平扩展、缓存、分库分表等手段,并讨论权衡——所有设计都是权衡。

估算技巧

面试常要求笔算估算。参考附录中的"2 的幂表"和"每个程序员都应知道的延迟数值"。

典型面试题(含解答)

文档为以下题目提供详细解答、代码与架构图:

题目 主题
Pastebin / Bit.ly 短链接生成、哈希、读写权衡
Twitter 时间线与搜索 Feed 流、推拉结合、搜索索引
网页爬虫 URL 调度、Robots、去重
Mint.com 数据聚合、ETL
社交网络数据结构 图模型、好友关系
搜索引擎 KV 存储 内存索引、分片、压缩
Amazon 销量排名 排序、缓存、实时性
AWS 上支持百万用户的系统 端到端架构演进

面向对象设计面试题(含解答)

哈希表、LRU 缓存、呼叫中心、扑克牌、停车场、在线聊天服务器、循环数组等常见题目,部分仍在完善中。

后续主题

文档后续深入探讨以下主题及其权衡:

  • 数据库:RDBMS(主从/主主复制、联邦、分片、反规范化、SQL 调优)与 NoSQL(KV、文档、宽列、图数据库)的选型。
  • 缓存:客户端、CDN、Web 服务器、数据库、应用、查询级、对象级缓存;更新策略包括 Cache-Aside、Write-Through、Write-Behind、Refresh-Ahead。
  • 异步:消息队列、任务队列、背压机制。
  • 通信:TCP、UDP、RPC、REST。
  • 安全附录(2 的幂表、延迟数值、真实架构案例、公司工程博客)。

摘要更新于 2026-08-04 00:31:21 · 原文 109682 字符 · md5 8b9cf3069f02…