什麼是分散式系統

程式設計師自由之路 發表於 2021-07-25

當單體應用的效能不能滿足逐漸增長的業務需求時,就出現了分散式系統。接下來的文章中就讓我們看下分散式系統的相關概念。

什麼是分散式系統

什麼是分散式系統

看了很多文章,感覺很少有文章能把這個概念解釋的既簡單,又清楚的。結合這自己的理解,我對分散式系統的概念做了下面的總結。

關於分散式系統的定義問題,我傾向從字面上來解釋:分開部署的系統就可以稱為分散式系統。

比如,一個系統原本由前端頁面、後臺服務和後端資料庫組成,將這些服務全都部署在一臺機器上,這種應用叫單體應用。現在我們將資料庫拿出來,單獨部署到另外一臺機器上,後端服務和資料庫之間通過網路通訊,這種部署方式就是一種最簡單的分散式系統。

再比如說,原本有一個後端服務,能支援500QPS的併發請求。現在業務量上升,需要能支援1000QPS的併發量。此時你有兩個方案。第一種就是增加系統的硬體效能,進行垂直擴充套件,此時系統還是單體應用;第二種方案就是再部署另外一臺機器,同樣也支援500QPS,這樣總體就能達到1000QPS的效能需求了。方案二的系統也是一種分散式系統,將本來可以部署一臺機器的應用原樣複製一份到另外的機器上再部署一份。方案二中,部署的多臺應用被也被稱為一個叢集,可以說叢集是分散式系統的一種。

再比如說,原本有一個系統中包含訂單服務、產品服務和支付等服務。現在隨著業務的不斷複雜化,將訂單服務、產品服務和支付服務單獨分拆出來形成訂單系統、產品系統和支付系統,交由專人負責。這種系統將原本的單體應用分拆成多個系統部署到不同的機器上,也是分散式系統,而且我們平時開發中所指的分散式系統大多是指這種系統。其實稍微有點分散式系統知識的同學可以看出來,這種系統就是最簡單的微服務系統。所以微服務也是分散式系統的一種。

分散式系統的優勢

單體應用的優勢在於它的簡單,但是其劣勢也相當明顯。一個就是容易出現單點故障,還有一個就是容易達到效能瓶頸。分散式系統很大程度上就是為了解決單體應用上面的問題而出現的。

分散式系統將一些廉價的 PC 機通過網路連線起來,共同完成工作,並且在系統中提供冗餘來解決高可用的問題。分散式系統通過廉價的 PC 機減輕了企業購買大型機的高昂費用,通過系統冗餘又解決了HA的問題。

雖然分散式系統通過多工作節點解決了單體應用面臨的高成本和可用性問題,但是它引入了對分散式系統內部工作節點的協調問題。

分散式系統的挑戰

分散式系統的核心就是解決一個問題:對分散式系統內部工作節點的協調問題。

看似簡單的問題會因網路丟包、節點當機恢復等場景變得異常複雜。由此才衍生出很多概念、協議和理論。為探究共識問題最大能解決的程度,於是有了CAP邊界理論;為在特定條件和範圍內解決該問題,於是有一致性協議Paxos、Raft、Zab和Viewstamped Replication;為構建這些協議,於是有多數派、Leader選舉、租約、邏輯時鐘等概念和方法。

又因為分散式系統分開部署的特點,在具體實施開發過程中,我們又要解決

  • 分散式事務問題;
  • session共享問題;
  • 分散式鎖問題;
  • 全域性時鐘問題;

還有一些列其他問題。雖然分散式系統解決了單體系統的單點故障和效能瓶頸問題,但同時也帶來了一系列“弊端”。但是技術就是這樣,沒有一個技術是完美的。我一直有個觀點就是:假如在一個領域中出現了一個完美的解決方案,那麼在這個領域,人就不再有價值。分散式系統的複雜性給我們帶來了更多學習的空間,讓善於學習的程式設計師有更多發揮自身價值的機會。