天天看點

分布式系統解決了單體系統的單點故障和性能瓶頸問題,但同時也帶來了一系列“弊端”

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

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

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

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

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

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

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

分布式系統将一些廉價的 PC 機通過網絡連接配接起來,共同完成工作,并且在系統中提供備援來解決高可用的問題。分布式系統通過廉價的 PC 機減輕了企業購買大型機的高昂費用,通過系統備援又解決了HA的問題。

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

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

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

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

分布式事務問題;

session共享問題;

分布式鎖問題;

全局時鐘問題;

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

人生的主旋律其實是苦難,快樂才是稀缺資源。在困難中尋找快樂,才顯得珍貴~