分佈式系統架構簡介

最近幾年,我們一直在談論各式各樣的架構,如高併發架構、異地多活架構、容器化架構、微服務架構、高可用架構、彈性化架構等。還有和這些架構相關的管理型的技術方法,如 DevOps、應用監控、自動化運維、SOA 服務治理、去 IOE 等。面對這麼多紛亂的技術,很多團隊或是公司都是一個一個地去做這些技術,非常辛苦,也非常累。這樣的做法就像我們在撐開一張網裏面一個一個的網眼。其實,只要我們能夠找到這張網的“綱”,我們就能比較方便和自如地打開整張網了。

分佈式系統架構的優缺點

首先,我們需要闡述一下爲什麼需要分佈式系統,而不是傳統的單體架構。也許這對你來說已經不是什麼問題了,但是請允許我在這裏重新說明一下。使用分佈式系統主要有兩方面原因。

1、增大系統容量。我們的業務量越來越大,而要能應對越來越大的業務量,一臺機器的性能已經無法滿足了,我們需要多臺機器才能應對大規模的應用場景。所以,我們需要垂直或是水平拆分業務系統,讓其變成一個分佈式的架構。

2、加強系統可用。我們的業務越來越關鍵,需要提高整個系統架構的可用性,這就意味着架構中不能存在單點故障。這樣,整個系統不會因爲一臺機器出故障而導致整體不可用。所以,需要通過分佈式架構來冗餘系統以消除單點故障,從而提高系統的可用性。

當然,分佈式系統還有一些優勢,比如:

因爲模塊化,所以系統模塊重用度更高;
因爲軟件服務模塊被拆分,開發和發佈速度可以並行而變得更快;
系統擴展性更高;
團隊協作流程也會得到改善;
……

不過,這個世界上不存在完美的技術方案,採用任何技術方案都是“按下葫蘆浮起瓢”,都是有得有失,都是一種 trade-off。也就是說,分佈式系統在解決上述問題的同時,也給我們帶來了其他的問題。因此,我們需要清楚地知道分佈式系統所帶來的問題。

下面這個表格比較了單體應用和分佈式架構的優缺點。



從上面的表格我們可以看到,分佈式系統雖然有一些優勢,但也存在一些問題。

架構設計變得複雜(尤其是其中的分佈式事務)。
部署單個服務會比較快,但是如果一次部署需要多個服務,流程會變得複雜。
系統的吞吐量會變大,但是響應時間會變長。
運維複雜度會因爲服務變多而變得很複雜。
架構複雜導致學習曲線變大。
測試和查錯的複雜度增大。
技術多元化,這會帶來維護和運維的複雜度。
管理分佈式系統中的服務和調度變得困難和複雜。

也就是說,分佈式系統架構的難點在於系統設計,以及管理和運維。所以,分佈式架構解決了“單點”和“性能容量”的問題,但卻新增了一堆問題。而對於這些新增的問題,還會衍生出更多的子問題,這就需要我們不斷地用各式各樣的技術和手段來解決這些問題。

這就出現了前面所說的那些架構方式,以及各種相關的管理型的技術方法。這個世界就是這樣變得複雜起來的。

分佈式系統的發展

從 20 世紀 70 年代的模塊化編程,80 年代的面向事件設計,90 年代的基於接口 / 構件設計,這個世界很自然地演化出了 SOA——基於服務的架構。SOA 架構是構造分佈式計算應用程序的方法。它將應用程序功能作爲服務發送給最終用戶或者其他服務。它採用開放標準與軟件資源進行交互,並採用標準的表示方式。

開發、維護和使用 SOA 要遵循以下幾條基本原則。

可重用,粒度合適,模塊化,可組合,構件化以及有互操作性。
符合開放標準(通用的或行業的)。
服務的識別和分類,提供和發佈,監控和跟蹤。

但 IBM 搞出來的 SOA 非常重,所以對 SOA 的裁剪和優化從來沒有停止過。比如,之前的 SOAP、WSDL 和 XML 這樣的東西基本上已經被拋棄了,而改成了 RESTful 和 JSON 這樣的方式。而 ESB(Enterprise Service Bus,企業服務總線)這樣非常重要的東西也被簡化成了 Pub/Sub 的消息服務……

下面是一個 SOA 架構的演化圖。



可以看到,面向服務的架構有以下三個階段

20 世紀 90 年代前,是單體架構,軟件模塊高度耦合。當然,這張圖同樣也說明了有的 SOA 架構其實和單體架構沒什麼兩樣,因爲都是高度耦合在一起的。就像圖中的齒輪一樣,當你調用一個服務時,這個服務會調用另一個服務,然後又調用另外的服務……於是整個系統就轉起來了。但是這本質是比較耦合的做法。

而 2000 年左右出現了比較松耦合的 SOA 架構,這個架構需要一個標準的協議或是中間件來聯動其它相關聯的服務(如 ESB)。這樣一來,服務間並不直接依賴,而是通過中間件的標準協議或是通訊框架相互依賴。這其實就是 IoC(控制反轉)和 DIP(依賴倒置原則)設計思想在架構中的實踐。它們都依賴於一個標準的協議或是一個標準統一的交互方式,而不是直接調用。

而 2010 年後,出現了微服務架構,這個架構更爲松耦合。每一個微服務都能獨立完整地運行(所謂的自包含),後端單體的數據庫也被微服務這樣的架構分散到不同的服務中。而它和傳統 SOA 的差別在於,服務間的整合需要一個服務編排或是服務整合的引擎。就好像交響樂中需要有一個指揮來把所有樂器編排和組織在一起。

微服務的出現使得開發速度變得更快,部署快,隔離性高,系統的擴展度也很好,但是在集成測試、運維和服務管理等方面就比較麻煩了。所以,需要一套比較好的微服務 PaaS 平臺。就像 Spring Cloud 一樣需要提供各種配置服務、服務發現、智能路由、控制總線……還有像 Kubernetes 提供的各式各樣的部署和調度方式。

沒有這些 PaaS 層的支撐,微服務也是很難被管理和運維的。好在今天的世界已經有具備了這些方面的基礎設施,所以,採用微服務架構,只是一個時間問題了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章