系統設計小抄 - 如何做到高可用、高吞吐、高擴展性
我們經常需要設計具有高可用性、高可擴展性和高吞吐量的系統。它們的確切含義是什么?
下圖是一份系統設計小抄,包含“三高”常見的解決方案。
圖片
01 高可用性
高可用意味著我們需要達到一個高水平的正常運行時間。我們通常將設計目標描述為 "3 個 9 " 或 "4 個 9"。"4 個九",即 99.99% 的正常運行時間,意味著服務每天只能中斷 8.64 秒。
要實現高可用性,我們需要在系統中設計冗余。有幾種方法可以做到這一點:
- Hot-Hot
兩個實例接收相同的輸入,并將輸出發送到下游服務。如果其中一方宕機,另一方可以立即接替。由于兩邊都向下游發送輸出,下游系統需要能夠處理重復數據。
- Hot-Warm
兩個實例接收相同的輸入,只有 Hot 端向下游服務發送輸出。如果 Hot 端宕機, Warm 端將接替并開始向下游服務發送輸出。
- 單領導集群 (Single Leader)
一個領導實例從上游系統接收數據并復制到其他副本。
- 無領導集群 (Leaderless)
這種集群中沒有領導者。任何寫入都會復制到其他實例。只要寫入實例數加上讀取實例數大于實例總數,我們就能獲得有效數據。這被稱為 quorum。
02 高吞吐量
這意味著服務需要在一段時間內處理大量請求。常用的指標是 QPS(每秒查詢次數)或 TPS(每秒事務次數)。
為了實現高吞吐量,我們通常會在架構中添加緩存,以避免經過數據庫或磁盤等較慢的 I/O 設備。我們還可以為計算密集型任務增加線程數量。但是,增加過多的線程會降低性能。因此,我們需要找出系統的瓶頸,提高系統的吞吐量。
我們還可以在系統中使用異步處理,以有效地單獨隔離耗時耗資源的組件。
03 高擴展性
高擴展性意味著系統可以快速、輕松地擴展,以容納更多的容量(橫向可擴展性)或更多的功能(縱向可擴展性)。通常,我們通過觀察響應時間來決定是否需要擴展系統。
要實現高度可擴展性,需要隔離每個服務的職責。為此,微服務被廣泛采用。我們還利用服務注冊和負載平衡器將請求路由到適當的實例。