iT邦幫忙

2026 iThome 鐵人賽

DAY 1
0
Software Development

系統是怎麼被流量打爆的?30 天實戰 System Design系列 第 1

Day 1|System Design 到底在設計什麼?從 Scalability 與 Trade-off 開始

  • 分享至 

  • xImage
  •  

為什麼開始學 System Design?

以前在做專案時,我比較在意的是「功能有沒有做出來」。

例如:

  • API 能不能正常回傳
  • Database schema 有沒有設計好
  • 程式會不會出錯
  • Model 或 Backend 跑得夠不夠快

但當我開始接觸比較大型的系統後,發現事情沒有這麼簡單。

一個服務只有幾十個使用者時,可能一台 Server 加一個 Database 就能正常運作;但如果使用者變成幾萬、幾百萬甚至更多,問題就會開始出現:

  • 一台 Server 不夠用了怎麼辦?
  • Database 撐不住怎麼辦?
  • Server 掛掉之後服務是不是就直接消失?
  • 多台 Server 之間要怎麼分配 Request?
  • 不同地區的使用者如何降低 Latency?
  • 多份 Database 資料不一致時該相信誰?

所以我開始理解,System Design 真正要處理的不是「怎麼把功能寫出來」,而是:

如何讓一個系統在流量、資料量與機器數量不斷增加之後,依然能維持合理的效能、可靠性與可用性。

而 System Design 最核心的一件事,就是 Trade-off

很多時候並不存在一個所有面向都最好的架構,而是根據需求選擇最適合的方案。


1. Performance vs Scalability

這兩個概念很容易混在一起,但實際上是在看不同的問題。

Performance

Performance 關心的是:

系統在目前的工作量下,執行得快不快?

例如:

GET /users/123

平均花:

50 ms

代表目前這個 API 的 Performance 不錯。


Scalability

Scalability 關心的是:

當 Workload 增加時,系統還能不能維持合理的效能?

例如:

1 user
→ 50 ms

1,000 users
→ 80 ms

10,000 users
→ 150 ms

100,000 users
→ timeout

前面 Performance 可能很好,但流量增加後就開始出問題,代表系統的 Scalability 不夠好。

可以簡單記成:

概念 問的問題
Performance 現在跑得快不快?
Scalability 流量變大後還撐不撐得住?

2. Scale-up vs Scale-out

當系統資源不夠時,通常有兩種擴展方式。

Scale-up:Vertical Scaling

把原本的機器升級成更強的硬體。

例如:

Before

4 CPU
8 GB RAM

變成:

After

32 CPU
128 GB RAM

優點

  • 架構簡單
  • 不需要處理太多 Distributed System 問題
  • Application 通常不需要大幅修改

缺點

  • 單台機器有硬體上限
  • 高階硬體成本可能快速增加
  • 仍可能存在 Single Point of Failure

Scale-out:Horizontal Scaling

不是把一台 Server 變強,而是增加更多 Server。

          ┌── Server A
          ├── Server B
User ─────┼── Server C
          └── Server D

優點

  • 理論上可以持續增加機器
  • 更容易提高 Throughput
  • 可以搭配 Redundancy 提高可靠性

缺點

開始需要處理:

  • Load Balancing
  • Data Replication
  • Consistency
  • Failure Handling
  • Network Communication
  • Heterogeneity
  • Coordination

所以:

Scale-out 解決了資源不足的問題,但同時也把系統帶進 Distributed Systems 的世界。


3. Redundancy:避免 Single Point of Failure

假設系統只有:

User
 |
 v
Server A

如果:

Server A ❌

整個服務就會掛掉。

這就是:

Single Point of Failure,SPOF


Introducing Redundancy

Redundancy 可以理解成:

額外準備一份可以替代原本資源的備援。

例如:

               ┌── Server A
User ── LB ────┼── Server B
               └── Server C

其中一台 Server 掛掉:

Server A ❌
Server B ✅
Server C ✅

服務仍然可以繼續。


Redundancy 也可以用在其他地方

Application Server

Server A
Server B
Server C

Database

Primary Database
├── Replica A
└── Replica B

Data Center

Taiwan Region
Japan Region
US Region

Redundancy 的主要目的:

  • 提高 Availability
  • 提高 Fault Tolerance
  • 避免 Single Point of Failure

但它也有成本:

  • 資料需要同步
  • 系統複雜度增加
  • Network Traffic 增加
  • 可能產生 Consistency 問題

4. Heterogeneity:不同 Node 不一定一樣強

Scale-out 久了,另一個常見問題就是:

Heterogeneity(異質性)

意思是:

Distributed System 裡面的機器不一定具有相同的能力。

例如一開始:

Node A:8 CPU / 32 GB RAM
Node B:8 CPU / 32 GB RAM
Node C:8 CPU / 32 GB RAM

幾年後新增:

Node D:32 CPU / 128 GB RAM
Node E:64 CPU / 256 GB RAM

現在每台 Node 的能力已經不同。


Heterogeneity 可能來自

  • 不同世代 CPU
  • 不同 GPU
  • 不同 RAM Capacity
  • 不同 Storage Capacity
  • 不同 Network Bandwidth
  • 不同 Geographic Location
  • 不同 Network Latency

例如:

Node A:Taipei
Node B:Tokyo
Node C:New York

即使硬體規格完全相同,Network Latency 也不一樣。


為什麼會造成問題?

假設三台機器的 Capacity:

Node A → 100 req/s
Node B → 100 req/s
Node C → 1000 req/s

如果平均分配:

300 Requests

A → 100
B → 100
C → 100

結果:

A → 100% utilization
B → 100% utilization
C → 10% utilization

Node C 的能力就被浪費了。

因此 Scheduler 或 Load Balancer 不能永遠假設:

All Nodes Have Equal Capacity

而可能要考慮:

  • CPU Capacity
  • Memory
  • Current Load
  • Network Latency
  • Storage Capacity
  • Hardware Generation

5. Latency vs Throughput

這兩個也是 System Design 很常看到的 Metric。

Latency

Latency 是:

完成一個操作需要多久時間。

例如:

Request
   |
   | 100 ms
   v
Response

代表:

Latency = 100 ms

Throughput

Throughput 是:

單位時間可以處理多少工作。

例如:

10,000 requests / second

代表:

Throughput = 10,000 RPS

差異

Metric 關心的事情
Latency 一個 Request 要等多久
Throughput 一秒可以處理多少 Request

可以用餐廳來理解:

  • 做一份餐點需要 5 分鐘 → Latency
  • 整間餐廳一小時能做 300 份 → Throughput

大型系統通常希望:

在 Latency 保持在可接受範圍內的前提下,提高 Throughput。


6. Availability vs Consistency

假設我們有兩份 Database:

          ┌── DB A
User ─────┤
          └── DB B

User 把名稱從:

Brian

改成:

Chih-Hsi

DB A 已經更新:

DB A → Chih-Hsi

但 DB B 還沒同步:

DB B → Brian

此時另一個 Request 查詢 DB B,就可能拿到舊資料。


Consistency

Consistency 關心:

使用者讀到的資料是不是最新且一致的?


Availability

Availability 關心:

使用者發送 Request 時,系統能不能持續提供 Response?

兩者在 Distributed System 發生 Network Failure 時,可能會互相衝突。


7. CAP Theorem

CAP 分別代表:

C = Consistency
A = Availability
P = Partition Tolerance

Consistency

每次 Read:

  • 拿到最新資料
  • 或直接失敗

不應該讀到不一致的版本。


Availability

每個 Request 都能獲得 Response。

但:

  • Response 不保證一定是最新資料

Partition Tolerance

當 Distributed System 裡的 Node 因為 Network Failure 無法互相溝通時,系統仍然能運作。

例如:

Taiwan DB ───── X ───── US DB
               ↑
        Network Partition

兩台 Database 都還活著。

但彼此不能同步。

這就是 Partition。


8. CP vs AP

Distributed System 通常不能假設 Network 永遠正常。

因此 Network Partition 發生時,需要考慮:

Consistency
     VS
Availability

CP:Consistency + Partition Tolerance

Network Partition 發生時:

DB A ─── X ─── DB B

如果無法確認資料是否一致:

Request
   ↓
Error / Timeout

也不願意回傳可能錯誤的資料。

特性

  • 優先確保資料正確
  • 可能犧牲 Availability

適合:

  • Financial Transaction
  • Distributed Lock
  • Inventory
  • 對資料正確性要求很高的系統

AP:Availability + Partition Tolerance

即使 Network Partition 發生:

Request
   ↓
仍然 Response

但可能拿到:

舊資料

例如:

DB A → followers = 1000
DB B → followers = 998

在部分場景中,短時間顯示 998 並不會造成重大問題。

Network 恢復後:

DB A
 ↕
Sync
 ↕
DB B

最後再恢復一致。

這類設計常會搭配:

Eventual Consistency


9. System Design 的核心:Trade-off

今天整理完後,我覺得最重要的不是把所有名詞背起來,而是理解每個設計都有代價。

例如:

選擇 好處 代價
Scale-up 簡單 有硬體上限
Scale-out Capacity 高 系統複雜
Replication Reliability 高 Consistency 更難
Strong Consistency 資料可靠 Availability / Latency 可能較差
Eventual Consistency Availability 高 短時間可能讀到舊資料
更多 Node Throughput 提高 Coordination Cost 增加

因此 System Design 不太是在問:

哪個 Architecture 最好?

而是在問:

在目前的 Requirements 下,哪一種 Trade-off 最合理?


10. System Design Interview 的基本流程

遇到:

Design Twitter

不應該一開始就直接畫:

Load Balancer
    ↓
Redis
    ↓
Kafka
    ↓
Database

而是先確認需求。


Step 1:Requirements

先確認:

  • 系統要有哪些功能?
  • 有多少 Users?
  • Read-heavy 還是 Write-heavy?
  • Latency Requirement?
  • Availability Requirement?
  • Consistency Requirement?

Step 2:Estimation

粗估:

  • Requests per second
  • Storage
  • Bandwidth
  • Daily Active Users
  • Read / Write Ratio

Step 3:High-Level Design

先畫出主要元件:

Client
  ↓
Load Balancer
  ↓
Application Server
  ↓
Database

Step 4:找 Bottleneck

檢查:

  • Server 撐不撐得住?
  • Database 撐不撐得住?
  • Network 是否成為瓶頸?
  • 有沒有 Single Point of Failure?

Step 5:逐步 Scaling

根據 Bottleneck 再加入:

  • Cache
  • CDN
  • Load Balancer
  • Replication
  • Sharding
  • Message Queue

而不是一開始把所有技術全部塞進架構。


References


下一篇
Day 2|輸入網址後發生了什麼?從 DNS、TCP 到 HTTP Request
系列文
系統是怎麼被流量打爆的?30 天實戰 System Design3
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言