System Design - paulip114/blog GitHub Wiki
設計一個可承受高流量(High Traffic)的網路服務,需要兼顧可擴展性(Scalability)、高可用性(High Availability)與容錯能力(Fault Tolerance)。
🚀 一、整體架構設計總覽
Client (Browser/App)
   ↓
CDN(Cloudflare、Akamai)
   ↓
Load Balancer(如 AWS ELB / Nginx / HAProxy)
   ↓
Web Application Servers(多台,Stateless)
   ↓
Cache Layer(Redis / Memcached)
   ↓
Database(主從架構 + 分庫分表)
   ↓
Object Storage(如 AWS S3)
   ↓
Background Workers(排程/佇列)
🧱 二、核心設計原則
1. 前端加速與保護
- 
CDN(內容分發網路) - 儲存靜態資源(圖片、CSS、JS)
- 幫助全球快取、降低原始伺服器壓力
- 防止 DDoS(Cloudflare 等有防火牆)
 
- 
前端壓縮與快取策略 - 使用 Gzip/Brotli
- 設定 Cache-Control headers
 
2. 流量分攤:Load Balancer
- 
使用 Load Balancer 做流量分發(Layer 4 或 Layer 7) - 如 AWS ELB、Nginx、HAProxy
- 支援健康檢查、流量導向健康節點
 
- 
支援 Auto Scaling - 搭配 Kubernetes HPA 或 AWS Auto Scaling Group 動態擴展
 
3. 應用層:Stateless + 可橫向擴展
- 
設計 Stateless 的應用服務 - Session 放 Redis(或 JWT 無狀態驗證)
- 應用層可快速擴展多台實例
 
- 
部署方式 - Kubernetes(K8s)管理容器化部署
- 或使用 Serverless(如 AWS Lambda)處理突發高峰
 
4. 快取策略
- 前端快取(CDN)
- 應用層快取(Redis/Memcached)
- 頁面快取(Full Page Cache)
- 熱門資料快取(查詢結果、排行榜)
 
- 資料庫查詢結果快取
- Read-heavy 的系統可以顯著降低 DB 負載
 
5. 資料庫設計
- 
主從架構(Master-Slave) - 主庫處理寫入,從庫處理讀取
 
- 
分庫分表(Sharding) - 按用戶 ID、地區等方式分資料表或資料庫
 
- 
資料庫查詢優化 - 索引、避免 N+1 query、使用 EXPLAIN
 
- 
備援策略 - 定期備份、異地備援
 
6. 非同步處理
- 背景任務與 Queue
- 使用 RabbitMQ、Kafka、SQS 等佇列系統處理繁重任務(如寄信、影像處理)
 
- 排程任務(CronJob)
- 使用 Sidekiq、Celery、Bull 等背景工作系統
 
7. 服務監控與容錯
- 監控工具
- Prometheus + Grafana、Datadog、New Relic
 
- 異常告警
- 設定 SLA、健康檢查、錯誤告警
 
- 容錯與自動修復
- Kubernetes 具備 Pod Restart、自癒能力
- 可用性 > 99.99% 需要多 AZ(Availability Zone)
 
8. API 設計與限流
- 
Rate Limiting - 保護服務避免被濫用
- 可用 Redis + Token Bucket 或 Leaky Bucket 演算法實作
 
- 
API Gateway - 統一入口管理、驗證、限流(如 Kong、AWS API Gateway)
 
🔒 三、安全性設計
- HTTPS(全站)
- WAF(Web Application Firewall)
- 限制 IP/國家來源
- CSRF/XSS/SQLi 保護
- 使用 OAuth2 / JWT 做身分驗證
💡 四、針對不同情境的設計策略
| 情境 | 解法 | 
|---|---|
| 高讀取量 | 前端 CDN + Redis Cache + 從庫 | 
| 高寫入量 | 分庫分表 + 高效寫入 Queue | 
| 熱門活動 | 流量預估 + Auto Scaling + 緩存預熱 | 
| 用戶生成內容(圖片) | 上傳至 S3 / CDN 儲存,非同步轉檔 | 
| 排行榜 / 動態 | Redis 排行榜 + 快取更新策略 | 
🔁 五、彈性擴展設計(Scalability)
- 水平方向(Horizontal Scaling):
- Web Server、Redis、DB Slave 都能橫向擴展
 
- 垂直方向(Vertical Scaling):
- 預留空間給核心服務(DB、隊列)
 
🛠️ 六、推薦技術選型
| 類別 | 推薦技術 | 
|---|---|
| Web Framework | Node.js / Go / Spring Boot / .NET Core | 
| 快取系統 | Redis / Memcached | 
| Queue 系統 | Kafka / RabbitMQ / BullMQ | 
| 部署平台 | AWS / GCP / Azure / Kubernetes | 
| 監控工具 | Prometheus / Grafana / ELK / Datadog | 
| DB | PostgreSQL / MySQL / MongoDB(視需求) | 
| CDN | Cloudflare / Akamai / Fastly |