API 設計決策框架 (API Design Framework)
核心決策樹
設計 API 時,先問兩個問題:
┌───────────────────────────┐
│ External client 或 Internal? │
└─────────┬─────────────────┘
│
┌───────────────┴───────────────┐
External Internal
│ │
▼ ▼
┌───────────────────┐ RPC
│ Over/Under fetch │ (gRPC)
│ 是 concern 嗎? │
└─────────┬─────────┘
│
┌────┴────┐
│ │
Yes No
│ │
▼ ▼
GraphQL REST
兩個提問順序
- 對外還是對內? → Internal 直接選 RPC
- Over-/Under-fetching 是痛點嗎? → Yes 選 GraphQL;No 選 REST
三個選項的定位
| 範式 | 設計導向 | 對誰 | 預設場景 |
|---|---|---|---|
| REST | 資源導向(Resource) | 對外 | 外部公開 API、跨平台、CDN 快取 |
| GraphQL | 查詢導向(Query) | 對外 | 前端靈活查詢、避免 over-fetch |
| RPC | 方法導向(Method) | 對內 | 微服務高效能通訊 |
Over-fetching / Under-fetching 判斷
這是 REST 最常被質疑的兩個痛點:
| 現象 | 定義 | 例子 |
|---|---|---|
| Over-fetching | API 回傳比前端需要的多 | 只想要姓名,卻拿到整個 user object(含地址、生日、偏好) |
| Under-fetching | 一個頁面需要多次 API call 才拿到所需資料 | 首頁要顯示:用戶 + 訂單清單 + 通知 → 3 次 call |
什麼時候這會變成 concern?
Yes → GraphQL 有優勢
- 行動裝置、弱網路 → 每個 byte 都重要
- 複雜前端畫面(dashboard、feed)需要組合多資源
- 前後端團隊分離,前端需求常變動
No → REST 就夠
- 頻寬充足、畫面單純
- 需要瀏覽器/CDN HTTP caching
- 團隊熟悉度優先
為什麼 Internal 直接跳 RPC?
- 效能:Protobuf 二進位序列化比 JSON 快約 10 倍
- 契約:IDL 保證跨語言嚴格型別,避免 schema drift
- 串流:gRPC 支援雙向 streaming(HTTP/2)
- 對內可控:不需擔心瀏覽器 / 第三方相容性
面試陷阱:過早跳到 gRPC
面試官想看你先解決功能性問題,再考慮協定優化。
正確順序:先 REST → 發現內部服務間有效能瓶頸 → 再改 gRPC。
外部 API 千萬不要一開始就提 gRPC。
混合策略(業界常見)
┌─────────────┐
│ Browser │ ◄──── REST / GraphQL (JSON / HTTP)
└──────┬──────┘
│
┌──────▼──────┐
│ API Gateway │
└──────┬──────┘
│ gRPC (Protobuf / HTTP/2)
┌───────┼───────┐
▼ ▼ ▼
Service Service Service
外部 REST/GraphQL + 內部 gRPC 是最常見的架構。
決策檢查清單
面試回答「我選 X」之前,先過一遍:
Simplification-with-exceptions
這張圖是簡化版
真實決策還要考慮:
- 即時推送需求 → SSE / WebSocket / GraphQL Subscription(不是這張圖的範圍)
- 大檔上傳 / 串流 → REST 的 chunked upload / gRPC streaming
- 合作夥伴 B2B API → 雖然「對外」但可能用 gRPC + mTLS(雙方都是服務)
- 遺留系統 → SOAP、XML-RPC 仍存在,但面試中幾乎不會提
Related Notes
- 03-API-Design/02-REST — External + no fetching concern 的預設
- 03-API-Design/03-GraphQL — External + 需要靈活查詢
- 03-API-Design/04-RPC-and-gRPC — Internal 微服務通訊
- 03-API-Design/05-API-Security — 不論範式都需要考慮
- 01-Networking/04-API-Paradigms(01-Networking)— 速覽版
- 03-API-Design/Practice-API-Design