系统设计入门
一句话简介
面向软件工程师的系统设计学习资源,涵盖可扩展架构、负载均衡、缓存、数据库等核心概念,配有大量图表与真实案例。
标签
适用应用场景
- 技术面试复习
- 构建高可用后端服务
- 学习分布式系统架构
- 团队技术培训参考
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…