所謂分散式系統,是指硬體或軟體元件分佈在不同的網路計算機上,彼此之間僅僅透過訊息傳遞進行通訊和協調的系統。我們從這個定義中可以看出分散式系統包含兩個區別於單塊系統的本質性特徵,一個是網路,分散式系統的所有元件都位於網路之中,對於網際網路應用而言,則位於更為複雜的網際網路環境中;另一個是通訊和協調,與單塊系統不同,位於分散式系統中的各個元件只有透過約定、高效且可靠的通訊機制進行相關協作才能完成某一項業務功能。這是我們在設計和實現分散式系統時首先需要考慮的兩個方面。下圖展示的就是從軟體開發檢視出發得到的一個典型的分散式系統,包含了分散式服務、訊息中介軟體和分散式快取等常見的用於構建分散式系統的技術實現方式。顯然,這些工具位於一個封閉或開放的網路環境中,相互之間透過服務的註冊和發現、訊息傳遞、資料的快取共享等機制完成協作。
在分散式系統中,我們為了打破單塊系統中集中式的系統架構,引入系統拆分的思想和實踐。拆分的需求來自組織結構變化、交付速度、業務需求以及技術需求所引起的變化,一般認為系統拆分的基本思路有兩種,即縱向(Vertical)拆分和橫向(Horizontal)拆分。
所謂縱向拆分,就是將一個大應用拆分為多個小應用,如果新業務較為獨立,那麼就直接將其設計部署為一個獨立的應用系統即可。如下圖中,我們可以將移動醫療系統中的預約掛號業務拆分成訂單、醫院和使用者等獨立業務子系統。縱向拆分關注於業務,透過梳理產品線,將內聚度較高的相關業務進行剝離從而形成不同的子系統。
相較縱向拆分的面向業務特性,橫向拆分更多關注於技術。透過將可以複用的業務拆分出來並獨立部署為分散式服務,只需呼叫這些分散式服務即可構建複雜的新業務。所以,橫向拆分的關鍵在於識別可複用的業務,設計服務介面並規範服務依賴關係。橫向拆分的的基本實現方式是構建分散式服務體系,下圖是對上圖中的預約掛號業務進行橫向拆分的結果。可以看到,當我們把訂單、醫生、號源和使用者等業務抽象成獨立的垂直化服務,並在各個服務上層實現分散式環境下的呼叫和管理框架,系統的業務就可以轉變為一種排列組合的構建方式。如基於訂單和支付服務,我們可以構建出業務1,而業務2可能只依賴於醫院和使用者管理服務。分散式服務框架提供了一種按需構建的機制,在保證各個分散式服務的技術、團隊、交付獨立發展的前提下,確保業務整合的靈活性和高效性。
然而,分散式系統相較於集中式系統而言具備優勢的同時,也存在一些我們不得不考慮的特性,包括但不限於:
1. 網路傳輸的三態性
構建分散式系統依賴網路通訊,而網路通訊表現為一個複雜且不可控的過程。相比與單機系統中函式式呼叫的失敗或者成功,網路通訊會出現“三態”的概念,即成功、失敗與超時。由於網路原因,訊息沒有成功傳送到接收方,而是在傳送過程就發生了丟失現象;或者接收方處理後,響應給傳送方的過程中發生訊息丟失現象。這些問題都會增加通訊的代價,如何使通訊的代價降到使用者可以忍耐的層次是分散式系統設計的重要目標。
2. 異構性
相較單塊系統,分散式系統由於基於不同的網路、作業系統、軟體實現技術體系,必須要考慮一種通用的服務整合和互動方式來遮蔽異構系統之間的差異。異構系統之間的不同處理方式會對系統設計和開發帶來難度和挑戰。
3. 負載均衡
在集中式系統中,各部件的任務明確。但是分散式系統是多機協同工作的系統,為了提高系統的整體效率和吞吐量,必須考慮最大程度發揮每個節點的作用。負載均衡是保證系統執行效率的關鍵技術。
4. 資料一致性
在分散式系統中,資料被分散或者複製到不同的機器上,如何保證各臺主機之間的資料一致性將成為一個難點。因為網路的異常會導致分散式系統中只有部分節點能夠正常通訊,從而形成了網路分割槽(Network Partition)。
5. 服務的可用性
分散式系統中的任何伺服器都有可能出現故障,且各種故障不盡相同。而執行在伺服器上的服務也可能出現各種異常情況,服務之間出現故障的時機也會相互獨立。通常,分散式系統要設計成允許出現部分故障而不影響整個系統的正常可用。
以上問題是分散式系統的基本特性,我們無法避免,只能想辦法進行利用和管理,這就給我們設計和實現分散式系統提出了挑戰。
所謂分散式系統,是指硬體或軟體元件分佈在不同的網路計算機上,彼此之間僅僅透過訊息傳遞進行通訊和協調的系統。我們從這個定義中可以看出分散式系統包含兩個區別於單塊系統的本質性特徵,一個是網路,分散式系統的所有元件都位於網路之中,對於網際網路應用而言,則位於更為複雜的網際網路環境中;另一個是通訊和協調,與單塊系統不同,位於分散式系統中的各個元件只有透過約定、高效且可靠的通訊機制進行相關協作才能完成某一項業務功能。這是我們在設計和實現分散式系統時首先需要考慮的兩個方面。下圖展示的就是從軟體開發檢視出發得到的一個典型的分散式系統,包含了分散式服務、訊息中介軟體和分散式快取等常見的用於構建分散式系統的技術實現方式。顯然,這些工具位於一個封閉或開放的網路環境中,相互之間透過服務的註冊和發現、訊息傳遞、資料的快取共享等機制完成協作。
在分散式系統中,我們為了打破單塊系統中集中式的系統架構,引入系統拆分的思想和實踐。拆分的需求來自組織結構變化、交付速度、業務需求以及技術需求所引起的變化,一般認為系統拆分的基本思路有兩種,即縱向(Vertical)拆分和橫向(Horizontal)拆分。
所謂縱向拆分,就是將一個大應用拆分為多個小應用,如果新業務較為獨立,那麼就直接將其設計部署為一個獨立的應用系統即可。如下圖中,我們可以將移動醫療系統中的預約掛號業務拆分成訂單、醫院和使用者等獨立業務子系統。縱向拆分關注於業務,透過梳理產品線,將內聚度較高的相關業務進行剝離從而形成不同的子系統。
相較縱向拆分的面向業務特性,橫向拆分更多關注於技術。透過將可以複用的業務拆分出來並獨立部署為分散式服務,只需呼叫這些分散式服務即可構建複雜的新業務。所以,橫向拆分的關鍵在於識別可複用的業務,設計服務介面並規範服務依賴關係。橫向拆分的的基本實現方式是構建分散式服務體系,下圖是對上圖中的預約掛號業務進行橫向拆分的結果。可以看到,當我們把訂單、醫生、號源和使用者等業務抽象成獨立的垂直化服務,並在各個服務上層實現分散式環境下的呼叫和管理框架,系統的業務就可以轉變為一種排列組合的構建方式。如基於訂單和支付服務,我們可以構建出業務1,而業務2可能只依賴於醫院和使用者管理服務。分散式服務框架提供了一種按需構建的機制,在保證各個分散式服務的技術、團隊、交付獨立發展的前提下,確保業務整合的靈活性和高效性。
然而,分散式系統相較於集中式系統而言具備優勢的同時,也存在一些我們不得不考慮的特性,包括但不限於:
1. 網路傳輸的三態性
構建分散式系統依賴網路通訊,而網路通訊表現為一個複雜且不可控的過程。相比與單機系統中函式式呼叫的失敗或者成功,網路通訊會出現“三態”的概念,即成功、失敗與超時。由於網路原因,訊息沒有成功傳送到接收方,而是在傳送過程就發生了丟失現象;或者接收方處理後,響應給傳送方的過程中發生訊息丟失現象。這些問題都會增加通訊的代價,如何使通訊的代價降到使用者可以忍耐的層次是分散式系統設計的重要目標。
2. 異構性
相較單塊系統,分散式系統由於基於不同的網路、作業系統、軟體實現技術體系,必須要考慮一種通用的服務整合和互動方式來遮蔽異構系統之間的差異。異構系統之間的不同處理方式會對系統設計和開發帶來難度和挑戰。
3. 負載均衡
在集中式系統中,各部件的任務明確。但是分散式系統是多機協同工作的系統,為了提高系統的整體效率和吞吐量,必須考慮最大程度發揮每個節點的作用。負載均衡是保證系統執行效率的關鍵技術。
4. 資料一致性
在分散式系統中,資料被分散或者複製到不同的機器上,如何保證各臺主機之間的資料一致性將成為一個難點。因為網路的異常會導致分散式系統中只有部分節點能夠正常通訊,從而形成了網路分割槽(Network Partition)。
5. 服務的可用性
分散式系統中的任何伺服器都有可能出現故障,且各種故障不盡相同。而執行在伺服器上的服務也可能出現各種異常情況,服務之間出現故障的時機也會相互獨立。通常,分散式系統要設計成允許出現部分故障而不影響整個系統的正常可用。
以上問題是分散式系統的基本特性,我們無法避免,只能想辦法進行利用和管理,這就給我們設計和實現分散式系統提出了挑戰。