為什麼面試官問系統設計
系統設計題考的不是「你記不記得 Kafka 的架構」,而是:
- 你能不能在模糊條件下做決策
- 你能不能說出 trade-off 而不是「哪個比較好」
- 你能不能估算量級(不需要精確,但要知道 10K RPS vs 10M RPS 的設計完全不同)
框架:5 個階段
1. 需求澄清(5 分鐘)
題目故意模糊,面試官要看你會不會問對問題:
功能性需求:
- 「這個系統的核心用例是什麼?前 3 個最重要的功能是什麼?」
- 「讀多還是寫多?讀寫比例大概是多少?」
- 「有沒有實時需求?還是 eventual consistency 可以接受?」
非功能性需求:
- 「預計多少 DAU / MAU?」
- 「latency 要求?可以接受幾秒?」
- 「data 要保留多久?有沒有法規合規要求?」
範圍確認:「我打算先設計 X 功能,Y 先不做——這樣可以嗎?」
2. Back-of-Envelope 估算(5 分鐘)
估算的目的是決定架構的量級——不需要精確,差一個量級就要設計不同。
常用數字:
DAU 1 千萬,平均每天 10 個操作 → QPS ≈ 10M × 10 / 86400 ≈ 1,157 QPS(平均)
峰值通常是平均的 3~5 倍 → 峰值 ≈ 5,000 QPS
儲存估算:
每則貼文 1 KB,每天 100 萬則 → 每天 1 GB → 3 年 ≈ 1 TB
記憶體估算:
Redis 快取最熱 20% 的資料,假設 10M 筆 profile,每筆 500 bytes
→ 10M × 500B × 20% = 1 GB cache size
這些數字決定:用單機還是分散式?用 SQL 還是 NoSQL?需不需要 CDN?
3. 高層架構(10 分鐘)
先畫 happy path——不要一開始就深入細節。
基本架構骨架:
Client → Load Balancer → App Server → DB
↓
Cache
↓
Message Queue → Worker
從這個骨架開始,根據需求補:
- 讀多?→ 加 Read Replica 或 Cache 層
- 寫入密集?→ 考慮 Message Queue buffering
- 有文件 / 圖片?→ 加 Object Storage(S3)+ CDN
- 跨地區?→ 加 CDN + 多 region deploy
4. 深入設計(15 分鐘)
面試官通常會挑 1-2 個子系統深入。常見要深入的區域:
API 設計:
POST /v1/tweets → 發文
GET /v1/tweets/{id} → 取單篇
GET /v1/users/{id}/feed → 取 timeline
資料庫 Schema:
- 用 SQL 還是 NoSQL?為什麼?
- 怎麼分 Shard?Shard key 選什麼?
- 哪些欄位要 Index?
Scale 瓶頸:
- 哪裡會先爆?→ DB 寫入?→ 主從延遲?→ Cache 命中率?
- 怎麼解?→ Read Replica → Sharding → CQRS
5. 進階討論(5 分鐘)
如果時間允許,面試官可能問:
- 「如果流量突然 10x,你怎麼處理?」
- 「如果要支援全球不同 region 的用戶?」
- 「這個設計的最弱點是什麼?」
常見題型拆解
Feed / Timeline 系統(Twitter、Facebook):
- Fan-out on write(預先推)vs fan-out on read(讀時拉)
- 關鍵:celebrity 用戶有 1 億個 follower,fan-out on write 會爆
短網址系統(TinyURL):
- Hash 選擇(base62 of 7 chars = 3.5 trillion unique URLs)
- 301 vs 302 redirect(cache 行為不同)
Rate Limiter:
- Token Bucket vs Sliding Window
- 分散式 rate limiting 需要 Redis + Lua script 保 atomic
通知系統:
- Push(APNs / FCM)vs WebSocket vs polling
- 送達保證 vs 重複送達處理(at-least-once delivery + idempotency key)
面試常見錯誤
- 跳過估算直接設計:不知道量級,架構選擇無從判斷
- 說「用 Kafka 就好」但說不出為什麼:面試官要的是 trade-off,不是技術名詞
- 設計完美系統:每個點都深入,時間不夠;面試官更想看廣度的清晰,不是某個角落的深入
- 不主動說自己的假設:「我假設 95% 的流量是讀」——說出你的假設,讓面試官修正