什麼是分佈式系統

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

什麼是分佈式系統

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

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

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

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

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

分佈式系統的優勢

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

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

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

分佈式系統的挑戰

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

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

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

  • 分佈式事務問題;
  • session共享問題;
  • 分佈式鎖問題;
  • 全局時鐘問題;

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