Chuyển đến nội dung chính

第一課:什麼是系統設計? - 概述和路線圖

介紹系統設計,為什麼需要係統設計,如何解決系統設計問題(需求→高層設計→深入研究→瓶頸)。比較整體系統與分散式系統。學習路線圖和必要的資源。

🏗️ 建築 — 第 1 課 第一課:什麼是系統設計? - 概述和 路線圖

系統架構:從零到英雄

第 1 部分:系統設計基礎

亞洲開發網

簡介

您可以在幾個小時內編寫一個簡單的 CRUD 應用程式。但是,當該應用程式需要服務數百萬用戶,每秒處理數千個請求,並確保99.99% 的正常運行時間時 - 這就是您需要系統設計的時候。

系統設計不僅僅是面試的知識。這是一項核心技能,可以幫助您:

  • 建構可擴展的系統
  • 做出正確的架構決策
  • 避免代價高昂的錯誤(重建整個系統)
  • 與團隊就技術決策進行有效溝通

1.什麼是系統設計?

1.1 定義

系統設計是確定軟體系統的架構、組件、模組、介面和資料以滿足特定要求的過程。

System Design = Architecture + Components + Data Flow + Trade-offs

1.2 為什麼系統設計很重要?

相沒有系統設計是的系統設計
原型快速、簡單有一個清晰的計劃
100 位使用者運作良好運作良好
10K 用戶慢啟動依然穩定
100 萬用戶系統崩潰,不得不重寫按計劃規模
成本重寫 = 10x 初始成本漸進式改善

1.3 系統設計與編碼

Coding:          "Làm sao để implement feature X?"
System Design:   "Làm sao để feature X hoạt động với 10M users,
                  99.99% uptime, <100ms latency?"

2. 如何解決系統設計問題

2.1 框架 4步

當遇到任何系統設計問題時,請使用以下框架:

┌─────────────────────────────────────────────────────┐
│  Step 1: Requirements & Constraints                  │
│  ┌─────────────────────────────────────────────┐    │
│  │ Functional Requirements (FR)                 │    │
│  │ Non-functional Requirements (NFR)            │    │
│  │ Constraints & Assumptions                    │    │
│  └─────────────────────────────────────────────┘    │
│                      ▼                               │
│  Step 2: High-Level Design                           │
│  ┌─────────────────────────────────────────────┐    │
│  │ Main components & connections                │    │
│  │ Data flow diagrams                           │    │
│  │ API design (endpoints)                       │    │
│  └─────────────────────────────────────────────┘    │
│                      ▼                               │
│  Step 3: Deep Dive into Core Components              │
│  ┌─────────────────────────────────────────────┐    │
│  │ Database schema                              │    │
│  │ Algorithm choices                            │    │
│  │ Data structures                              │    │
│  └─────────────────────────────────────────────┘    │
│                      ▼                               │
│  Step 4: Identify & Resolve Bottlenecks              │
│  ┌─────────────────────────────────────────────┐    │
│  │ Single points of failure                     │    │
│  │ Scaling strategies                           │    │
│  │ Monitoring & alerting                        │    │
│  └─────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────┘

2.2 範例:設計新聞閱讀系統

第 1 步 - 要求:

  • FR:使用者查看文章清單、閱讀詳細資訊、搜尋、評論
  • NFR:1000 萬天, <200ms latency, 99.9% availability
  • Constraints: Read-heavy (100:1 read/write ratio)

Step 2 - High-Level Design:

Users → CDN → Load Balancer → Web Servers → Cache → Database
                    │
                    └→ Search Service (Elasticsearch)

Step 3 - Deep Dive:

  • Database: PostgreSQL cho articles, Redis cho cache
  • 搜尋:帶有全文索引的Elasticsearch
  • CDN: Cache static assets + rendered HTML

Step 4 - Bottlenecks:

  • Database read bottleneck → Add read replicas
  • 熱門文章 → 使用 TTL 進行主動緩存
  • Search latency → Elasticsearch cluster scaling

3. Monolith vs Distributed Systems

3.1 Monolithic Architecture

┌─────────────────────────────────────┐
│         Monolithic Application       │
│  ┌─────┬─────┬─────┬─────┬──────┐  │
│  │ UI  │User │Order│Pay  │Search│  │
│  │Layer│ Svc │ Svc │ Svc │ Svc  │  │
│  └─────┴─────┴─────┴─────┴──────┘  │
│  ┌─────────────────────────────┐    │
│  │      Shared Database         │    │
│  └─────────────────────────────┘    │
└─────────────────────────────────────┘

優勢:

  • 初始開發簡單
  • 易於部署(1 個工件)
  • 易於調試(單進程)
  • 元件之間沒有網路延遲

缺點:

  • 很難縮放每個單獨的部分
  • 一個小錯誤可能會導致整個系統崩潰
  • 當程式碼庫很大時部署很慢
  • Technology lock-in (1 language/framework)

3.2 Distributed Systems

┌────────┐  ┌────────┐  ┌────────┐  ┌────────┐
│ User   │  │ Order  │  │Payment │  │ Search │
│Service │  │Service │  │Service │  │Service │
│  DB    │  │  DB    │  │  DB    │  │  DB    │
└───┬────┘  └───┬────┘  └───┬────┘  └───┬────┘
    │           │           │           │
    └───────────┴─────┬─────┴───────────┘
                      │
              Message Queue / API Gateway

優勢:

  • 獨立擴展每項服務
  • 故障隔離(1個服務故障≠整個系統故障)
  • 團隊自治(每個團隊擁有 1 項服務)
  • Technology diversity

缺點:

  • 更複雜
  • 服務之間的網路延遲
  • Data consistency challenges
  • Operational overhead (monitoring, debugging)

3.3 什麼時候選擇什麼?

標準巨石分散式
Team size< 10 developers> 10 名開發人員
交通< 10K RPS> 10K RPS
階段MVP,早期啟動成長、規模
複雜性中高
部署頻率每週/每月每日/每小時

建議: 大多數系統應該從 Monolith 開始,然後根據需要擴展到分散式。不要從一開始就過度設計!


4. 需要掌握的核心概念

4.1 系統設計圖

                    System Design
                         │
    ┌────────────────────┼────────────────────┐
    │                    │                    │
Fundamentals        Components           Patterns
    │                    │                    │
├─ Scalability      ├─ Load Balancer    ├─ Microservices
├─ Availability     ├─ CDN              ├─ Event-Driven
├─ Consistency      ├─ Cache            ├─ CQRS
├─ Latency          ├─ Database         ├─ Saga
├─ Throughput       ├─ Message Queue    ├─ Circuit Breaker
├─ CAP Theorem      ├─ API Gateway      ├─ DDD
└─ Networking       ├─ Reverse Proxy    └─ Serverless
                    └─ Search Engine

4.2 學習路線圖

Tháng 1-2: Fundamentals
  ├─ Scalability, Availability, Consistency
  ├─ CAP Theorem
  └─ Networking basics

Tháng 3-4: Infrastructure Components
  ├─ Load Balancer, CDN, Cache
  ├─ Database (SQL, NoSQL, Sharding)
  └─ Message Queues

Tháng 5-6: Architectural Patterns
  ├─ Microservices, Event-Driven
  ├─ CQRS, Saga, DDD
  └─ Serverless

Tháng 7-8: Case Studies & Practice
  ├─ Design URL Shortener
  ├─ Design Chat System
  ├─ Design News Feed
  └─ Design Video Streaming

5. 粗略計算

系統設計的一項重要技能是快速估算:

5.1 二的冪

電源確切值大約位元組
1010 1,0241,024 10001000 1 KB
201,048,5761,048,576 100 萬1MB
301,073,741,82410 億1GB
401,099,511,627,7761兆1TB

5.2 每個程式設計師都應該知道的延遲數字

L1 cache reference:                    0.5 ns
L2 cache reference:                      7 ns
Main memory reference:                 100 ns
SSD random read:                   150,000 ns  =  150 μs
HDD seek:                      10,000,000 ns  =   10 ms
Send 1 MB over 1 Gbps network: 10,000,000 ns  =   10 ms
Read 1 MB from SSD:             1,000,000 ns  =    1 ms
Read 1 MB from HDD:            30,000,000 ns  =   30 ms
Roundtrip same datacenter:        500,000 ns  =  500 μs
Roundtrip CA → Netherlands:   150,000,000 ns  =  150 ms

5.3 範例:Twitter 的儲存估算

Giả sử:
- 500M users, 200M DAU
- Mỗi user tweet 2 lần/ngày
- Mỗi tweet: 140 chars * 2 bytes = 280 bytes
- 10% tweets có media (ảnh 200KB trung bình)

Tweets/ngày: 200M * 2 = 400M tweets
Text storage/ngày: 400M * 280B = 112 GB/ngày
Media storage/ngày: 40M * 200KB = 8 TB/ngày

Storage/năm: (112GB + 8TB) * 365 ≈ 3 PB/năm

6. 總結

主題要點
系統設計設計符合大規模需求的系統
框架需求→進階→深入研究→瓶頸
巨石從整體開始,根據需要進行分離
分散式更複雜但允許縮放
估計設計前一定要進行評估

練習

  1. 估價實務: 預計 YouTube 1 年內所需儲存空間(500M DAU,每天上傳 500 萬個視頻,轉碼後平均 50MB/視頻)

  2. 整體式 vs 分散式: 您正在為越南市場(500 萬用戶)建立飯店預訂應用程式。您會選擇整體式還是分散式?解釋一下為什麼。

  3. 系統設計架構: 應用 4 步驟架構來草擬 餐廳預約管理系統 的設計(5 萬家餐廳,100 萬用戶)。