分布式系统的基本特征
所謂分布式系統,是指硬件或軟件組件分布在不同的網絡計算機上,彼此之間僅僅通過消息傳遞進行通信和協調的系統。我們從這個定義中可以看出分布式系統包含兩個區別于單塊系統的本質性特征,一個是網絡,分布式系統的所有組件都位于網絡之中,對于互聯網應用而言,則位于更為復雜的互聯網環境中;另一個是通信和協調,與單塊系統不同,位于分布式系統中的各個組件只有通過約定、高效且可靠的通信機制進行相關協作才能完成某一項業務功能。這是我們在設計和實現分布式系統時首先需要考慮的兩個方面。下圖展示的就是從軟件開發視圖出發得到的一個典型的分布式系統,包含了分布式服務、消息中間件和分布式緩存等常見的用于構建分布式系統的技術實現方式。顯然,這些工具位于一個封閉或開放的網絡環境中,相互之間通過服務的注冊和發現、消息傳遞、數據的緩存共享等機制完成協作。
在分布式系統中,我們為了打破單塊系統中集中式的系統架構,引入系統拆分的思想和實踐。拆分的需求來自組織結構變化、交付速度、業務需求以及技術需求所引起的變化,一般認為系統拆分的基本思路有兩種,即縱向(Vertical)拆分和橫向(Horizontal)拆分。
所謂縱向拆分,就是將一個大應用拆分為多個小應用,如果新業務較為獨立,那么就直接將其設計部署為一個獨立的應用系統即可。如下圖中,我們可以將移動醫療系統中的預約掛號業務拆分成訂單、醫院和用戶等獨立業務子系統。縱向拆分關注于業務,通過梳理產品線,將內聚度較高的相關業務進行剝離從而形成不同的子系統。
相較縱向拆分的面向業務特性,橫向拆分更多關注于技術。通過將可以復用的業務拆分出來并獨立部署為分布式服務,只需調用這些分布式服務即可構建復雜的新業務。所以,橫向拆分的關鍵在于識別可復用的業務,設計服務接口并規范服務依賴關系。橫向拆分的的基本實現方式是構建分布式服務體系,下圖是對上圖中的預約掛號業務進行橫向拆分的結果。可以看到,當我們把訂單、醫生、號源和用戶等業務抽象成獨立的垂直化服務,并在各個服務上層實現分布式環境下的調用和管理框架,系統的業務就可以轉變為一種排列組合的構建方式。如基于訂單和支付服務,我們可以構建出業務1,而業務2可能只依賴于醫院和用戶管理服務。分布式服務框架提供了一種按需構建的機制,在保證各個分布式服務的技術、團隊、交付獨立發展的前提下,確保業務整合的靈活性和高效性。
然而,分布式系統相較于集中式系統而言具備優勢的同時,也存在一些我們不得不考慮的特性,包括但不限于:
1. 網絡傳輸的三態性
構建分布式系統依賴網絡通信,而網絡通信表現為一個復雜且不可控的過程。相比與單機系統中函數式調用的失敗或者成功,網絡通信會出現“三態”的概念,即成功、失敗與超時。由于網絡原因,消息沒有成功發送到接收方,而是在發送過程就發生了丟失現象;或者接收方處理后,響應給發送方的過程中發生消息丟失現象。這些問題都會增加通信的代價,如何使通信的代價降到用戶可以忍耐的層次是分布式系統設計的重要目標。
2. 異構性
相較單塊系統,分布式系統由于基于不同的網絡、操作系統、軟件實現技術體系,必須要考慮一種通用的服務集成和交互方式來屏蔽異構系統之間的差異。異構系統之間的不同處理方式會對系統設計和開發帶來難度和挑戰。
3. 負載均衡
在集中式系統中,各部件的任務明確。但是分布式系統是多機協同工作的系統,為了提高系統的整體效率和吞吐量,必須考慮最大程度發揮每個節點的作用。負載均衡是保證系統運行效率的關鍵技術。
4. 數據一致性
在分布式系統中,數據被分散或者復制到不同的機器上,如何保證各臺主機之間的數據一致性將成為一個難點。因為網絡的異常會導致分布式系統中只有部分節點能夠正常通信,從而形成了網絡分區(Network Partition)。
5. 服務的可用性
分布式系統中的任何服務器都有可能出現故障,且各種故障不盡相同。而運行在服務器上的服務也可能出現各種異常情況,服務之間出現故障的時機也會相互獨立。通常,分布式系統要設計成允許出現部分故障而不影響整個系統的正常可用。
以上問題是分布式系統的基本特性,我們無法避免,只能想辦法進行利用和管理,這就給我們設計和實現分布式系統提出了挑戰。
?
如果對文章感興趣,可以關注我的微信公眾號:程序員向架構師轉型,或掃描下面的二維碼。
我出版了《系統架構設計:程序員向架構師轉型之路》、《向技術管理者轉型:軟件開發人員跨越行業、技術、管理的轉型思維與實踐》、《微服務設計原理與架構》、《微服務架構實戰》等書籍,并翻譯有《深入RabbitMQ》和《Spring5響應式編程實戰》,歡迎交流
總結
以上是生活随笔為你收集整理的分布式系统的基本特征的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式系统到底是什么
- 下一篇: 华为十年架构师实战经验总结:大规模分布式