第 02 课
系统设计入门
负载均衡、缓存、数据库选型与 API 设计。
课程内容
系统设计入门
系统设计面试考察的是"在约束下做权衡"的能力。本课覆盖面试中最常考的基础设施概念,以及回答系统设计题的通用框架。
学习目标
- 掌握负载均衡、缓存、数据库选型的核心概念
- 会画一个典型 Web 系统的架构图
- 掌握系统设计面试的答题框架
核心概念
负载均衡(Load Balancer)
把流量分发到多台服务器,避免单点压力:
- 轮询 / 加权轮询:依次分发,简单常用
- 最少连接:发给当前连接数最少的机器
- 一致性哈希:同一用户的请求落到同一台机器(会话亲和)
- 常见实现:Nginx、云厂商的 LB 服务
缓存(Cache)
用内存换速度,挡在数据库前面:
读请求 → 查缓存 → 命中?返回 : 查数据库 → 写入缓存 → 返回
- Redis:最常用的内存缓存,支持字符串、哈希、列表、有序集合
- 缓存穿透:查询不存在的数据 → 缓存空值或布隆过滤器
- 缓存雪崩:大量 key 同时过期 → 过期时间加随机抖动
- 缓存击穿:热点 key 过期瞬间被打爆 → 互斥锁重建
数据库选型
| 类型 | 代表 | 适用场景 |
|---|---|---|
| 关系型 | MySQL、PostgreSQL | 强一致、事务、复杂关联查询(订单、支付) |
| 文档型 | MongoDB | 结构灵活、快速迭代(内容、日志) |
| 键值型 | Redis | 缓存、会话、排行榜 |
| 列式 | ClickHouse | 分析查询、大数据量聚合 |
读写扩展手段:索引 → 读写分离(主从复制)→ 分库分表(水平拆分)。
API 设计
- REST 风格:资源用名词,动作用 HTTP 方法
- 幂等性:重试不会产生副作用(GET/PUT/DELETE 天然幂等,POST 需要唯一请求 ID)
- 限流:令牌桶 / 滑动窗口,保护系统不被突发流量打垮
面试答题框架(4 步法)
- 澄清需求(5 分钟):用户量?QPS?读多还是写多?一致性要求?
"设计 Twitter" → 先问:日活多少?要不要支持媒体?timeline 实时性要求?
- 估算量级:1 亿日活 ≈ 平均 1200 QPS,峰值 ×3;存储按每条数据大小 × 条数估算
- 高层设计:画出 客户端 → LB → 应用服务器 → 缓存 → 数据库 的主链路
- 深入细节:挑 1~2 个难点展开(如 timeline 用推模式还是拉模式),主动讲权衡
经典例题(由浅入深)
- 设计短链接服务(TinyURL)——哈希、301/302、KV 存储
- 设计限流器——令牌桶、分布式限流
- 设计新闻 Feed——推/拉模式、分页、缓存
参考资源
- System Design Primer(中文翻译版)
- ByteByteGo 系统设计频道
- 《系统设计面试:内幕指南》(Alex Xu 著,有中文版)