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