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

如何設計高流量的系統設計架構