設計可擴展且可靠的系統,需要理解一組核心的可重用建構模組。本文涵蓋最常見的元件——從負載平衡器、資料庫到快取與 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 服務非同步處理。這使系統更加可靠且易於擴展——生產者與消費者可以獨立擴展,彼此的故障也不會互相影響。
