快轉到主要內容

系統設計中的常見元件

·1131 字·3 分鐘
Kuo-Hsiu (Kourtney) Lee
作者
Kuo-Hsiu (Kourtney) Lee
Software developer. Writing about systems, architecture, software design, and technologies.

設計可擴展且可靠的系統,需要理解一組核心的可重用建構模組。本文涵蓋最常見的元件——從負載平衡器、資料庫到快取與 CDN——以及使用這些元件時需要考量的關鍵取捨。

負載平衡器、多台網頁伺服器與自動擴展
#

負載平衡器將傳入流量分配至多台網頁伺服器,為系統提供單一對外的入口點。

  • 對外只暴露一個公開 IP(即負載平衡器的 IP)
    • 網頁伺服器之間以及與負載平衡器之間透過私有 IP 通訊,提升安全性
  • 負載平衡池中的多台網頁伺服器提供故障轉移與高可用性
  • 自動擴展:依據流量自動新增或移除網頁伺服器

有狀態與無狀態網頁伺服器
#

有狀態架構將使用者的 Session 資料儲存在特定伺服器上,這意味著同一使用者的請求必須每次都路由到同一台伺服器。

  • 大多數負載平衡器透過 Sticky Session 支援此機制,但會帶來額外的開銷

有狀態架構的限制:

  • 擴展網頁伺服器的數量(增加或減少)變得困難
  • 處理伺服器故障變得困難,因為 Session 資料可能會遺失

無狀態架構將 Session 狀態從網頁伺服器中移出(例如存入共享快取或資料庫),讓任意一台伺服器都能處理任意請求。這通常是擴展性較佳的選擇。

搭配多個資料中心的 geoDNS
#

網頁伺服器及其他元件(資料庫、快取)分佈在不同地理區域的資料中心。使用者透過 geoDNS 被路由到最近的資料中心。

  • 提供跨區域的故障轉移與高可用性

注意事項:

  • 資料一致性:不同區域的使用者可能從不同的資料庫讀取資料,因此必須實作資料同步機制,以確保故障轉移期間的資料一致性。
  • 部署:服務必須在所有資料中心保持一致地部署。

資料庫副本
#

主從(Primary-Replica)架構:主節點(Primary)負責寫入,副本節點(Replica)負責讀取。通常副本節點的數量遠多於主節點。

確保:

  • 效能:讀取與寫入操作可同時進行
  • 可靠性:多份資料庫副本可防止資料遺失
  • 高可用性:當某個節點故障時支援故障轉移

快取
#

快取是位於應用程式與資料庫之間的記憶體資料儲存,用於更快地提供頻繁存取的資料。

優點:

  • 提升回應效能
  • 降低資料庫的負載
  • 可獨立於資料庫層進行擴展

注意事項:

  • 過期策略:若 TTL 設定過長,可能會提供過期資料
  • 資料一致性:資料庫、快取與 CDN 之間的資料可能不一致
  • 淘汰策略:當快取空間已滿時,決定移除哪些資料——常見策略包括 LRU(最近最少使用)與 FIFO(先進先出)

CDN
#

內容傳遞網路(CDN)將靜態資源(圖片、CSS、JavaScript)快取在不同地理區域的伺服器上,讓使用者從最近的節點取得資源,以提升效能。

注意事項:

  • 快取過期時間:TTL 設定過長可能提供過期的靜態資源;設定過短則會降低 CDN 的效果
  • CDN 故障處理:當 CDN 無法使用時,應用程式應能優雅地回退至原始伺服器

訊息佇列
#

訊息佇列將工作的生產者與消費者解耦,讓任務可以由 Worker 服務非同步處理。這使系統更加可靠且易於擴展——生產者與消費者可以獨立擴展,彼此的故障也不會互相影響。