深造分布式 打败面试官 招式一 小试牛刀
分布式系統和單體系統之間到底有什么區別?
- 前言
- 問題
- 解答
- 演變
- 提出問題
- 問題分析
- Case1: 為什么系統構建的主流方式會從單體系統演變到現在的分布式系統?
- Case2:傳統單體系統存在哪些核心問題
- Case3:相較單體系統,分布式系統具體有哪些優勢?
- Case 4 :分布式系統的本質特性
- 網絡傳輸的三態性
- 請求的容錯性
- 系統的異構性
- 數據的一致性
- 結尾
前言
無論是傳統系統、還是互聯網應用,分布式無疑是當下軟件設計和實現的主流技術體系。
圍繞分布式系統(Distributed System)的基本概念以及實現方式,開發人員需要掌握一系列對應的技術組件。另一方面,我們也需要認識到分布式系統的誕生并不是一蹴而就的,而是從傳統的單體系統(Monolith System)發展和演進而來。可以認為,分布式系統是對單體系統的一種改進,但這種改進同樣也帶來了復雜度和實現難度。
問題
那么,究竟什么是分布式系統?分布式系統和單體系統之間到底有什么區別?本講內容將圍繞這一問題展開討論。
解答
相信你對單體系統并不陌生,現實中很多單體系統都還運行在生產環境中。那么,什么樣的系統是單體系統呢?
所謂的單體系統,簡單來說,就是只包含一個物理組件的系統,能夠獨立進行部署和運行。下圖展示的就是一個典型的單體系統結構圖,可以看到在單體系統內部可以采用分層的方式合理組織代碼結構,但從物理上看就是一個能夠獨立運行的應用程序,服務都在同一個模塊里面 所以我們在使用的時候不會出現服務之間的配合系統的復雜度比較低 同時整個項目的復雜度相對于分布式相對較低 但是單模塊的體積比較大 容錯率比較低。
演變
現在,讓我們往上圖中再添加一個單體系統,這樣整個系統就有了兩個能夠獨立運行的應用程序。顯然,它們可以有自己的數據庫,并通過網絡通信完成交互,這就構成了一種分布式系統。如下圖所示:
在上圖中,雖然我們只是簡單把兩個獨立的單體系統組合在了一起,但是從系統本身而言卻發生了本質性的變化。原本一個單體系統可以完成的操作現在就需要兩個系統之間的有效協作,這顯然增加了系統的復雜度。但在這背后,也為我們更好地利用系統資源、構建合理的架構體系提供了基礎。在日常開發過程中,我們在引入分布式系統時需要分析具體的應用場景和需求,等同于 用復雜度換資源的合理利用 在剛使用分布式系統的時候 我們首先感覺的是復雜 一個數據可能需要多個服務之間的配合 但是從長遠來看等到項目有一定規模 分布式的好處就會慢慢的體現出來。
從面試角度講,關于分布式系統的討論往往比較發散,屬于典型的概念類面試題。但凡概念類的面試題,提問的方式通常是比較靈活的。關于單體系統和分布式系統的相關概念,以下幾種提問方式都屬于同一類的面試題:
提出問題
- 為什么系統構建的主流方式會從單體系統演變到現在的分布式系統?
- 傳統單體系統存在哪些核心問題?
- 相較單體系統,分布式系統具體有哪些優勢?
- 分布式系統的本質特性有哪些?
問題分析
任何系統設計方法和思想的誕生都具有一定的背景和條件,這點對于單體系統和分布式系統同樣如此。
Case1: 為什么系統構建的主流方式會從單體系統演變到現在的分布式系統?
在互聯網時代還沒有到來之前,技術人員主要的工作就是開發單體系統。所以,單體系統本身也是有很多優勢的,否則的話就無法成為當時主流的系統構建方式。事實上,時至今日,在線上運行的單體系統也并不少見。
那么,是什么原因導致分布式系統的出現呢?歸根結底是因為業務需求的復雜度、用戶數據的體量以及系統的開發和維護速度等因素的變化,導致了技術的演進。這是我們首先需要闡述的一點。
那么,為什么上述變化的出現,就會導致單體系統不能適應時代的發展要求呢?原因在于單體系統無論在應對業務復雜度和產品迭代速度,還是在處理高并發、大數據量的用戶請求,亦或是在代碼維護和團隊協作等方面都存在一系列問題。正是單體系統存在的這些問題,促使了我們不得不引入分布式系統。這是我們在面試過程中必須要重點闡述的,也是兩者之間差異點的一個重要維度。
另一方面,只要我們采用了分布式系統,就意味著所有這些問題都能得到解決嗎?顯然不是。任何事物都具有兩面性。雖然,和單體系統相比,分布式系統具備優勢,但它也引入了新的問題,包括網絡傳輸的三態性、數據的一致性和可用性等。這些分布式系統的本質特性是理解的的另一個重要維度。
通過上述分析,我們明確了這類問題背后的要點所在,開發人員往往只關注于具體分布式開發工具和框架的應用,關于分布式系統背后的設計思想和理念并不十分清楚
接下來,我們具體來分析一下背后的知識體系。
Case2:傳統單體系統存在哪些核心問題
在分布式系統成為主流的系統構建形式之前,開發人員在很長的一段時間里構建的都是單體系統。單體系統的主要優勢就是簡單。例如,如果我們使用 Spring Boot 框架來構建一個單體系統,那么它的表現形式就是一個能夠獨立運行的 JAR 包。開發人員通過簡單幾個步驟就可以開發出基于 HTTP 協議的 Web 服務。
但是,這種簡單性是相對的。如果業務需求變化很快、用戶請求體量巨大,那么通過構建一個簡單的單體系統就無法應對系統發展的要求。
在接下來的內容中,我們先來具體分析單體系統所存在的核心問題。
單體系統的核心問題表現在三個方面,即業務擴展性、性能伸縮性和代碼復雜度,如下圖所示:
我們先來看業務擴展性。所謂擴展性,指的是當系統的業務需求發生變化時,我們對現在系統的改動程度的一種控制能力。改動程度越大,擴展性就越差。顯然,對于單體系統而言,任何改動都會導致整個系統進行重新構建和發布,所以它的擴展性是比較低的。
另一方面,單體系統的可伸縮也不高。和擴展性關注業務變化的角度不同,伸縮性關注的是性能指標。如果通過簡單擴容就能確保系統的性能得到等比例的提升,那么我們就認為該系統具備較好的伸縮性。對于單體系統而言,由于內存密集型和 CPU 密集型的代碼都位于同一個服務器上,所以很難做到對資源的充分利用。
下圖展示的就是一個典型的例子,可以看到系統中的 A、B、C 組件的資源利用率是不同的。因為我們無法對單體系統中的這些組件進行拆分,所以也就無法單獨對圖中的 B、C 組件進行資源利用率的提升。
至于第三點的代碼復雜度問題,我們也不難理解。由于我們無法對單塊系統中的代碼進行物理上的拆分,所以不同組件之間的代碼邊界往往很難清晰劃分,這就無法有效控制代碼結構的復雜度。久而久之,因為代碼復雜度引起的系統缺陷就會難以維護。
上述三點是任何單體系統所普遍存在的問題。為了解決這些問題,分布式系統就應運而生了。
Case3:相較單體系統,分布式系統具體有哪些優勢?
什么是分布式系統?所謂分布式系統,區別于單體系統,會將整個系統拆分成多個能夠獨立運行的服務,這些服務在物理上是隔離的,相互之間基于網絡進行通信和協調。
下圖展示的就是現實場景中常見的一種分布式系統,可以看到這里有專門針對業務處理的業務服務 1 和業務服務 2 這兩個獨立的服務,也存在 Web 服務、消息中間件、緩存等提供技術能力的獨立組件。
顯然,想要實現分布式系統,首要的就是完成對系統中各個服務的合理拆分。通常,我們有兩種主流的拆分方式,即縱向(Vertical)拆分和橫向(Horizontal)拆分。
可以認為縱向拆分的目的就是更好地完成對系統中業務服務的合理組織。圍繞一個完整而復雜的業務執行流程,我們通常可以根據不同的業務場景以及數據屬性來完成對業務服務的拆分。例如,在常見的互聯網醫院系統中,具備最基本的醫生、患者以及問診等業務處理場景和數據,這時候我們就可以基于這些場景和數據來分別提取獨立的業務服務,如下圖所示:
介紹完縱向拆分,我們再來看橫向拆分。橫向拆分的切入點在于復用,即我們在提取一系列獨立服務的同時,還需要考慮通過一定的手段將它們高效地整合在一起。這樣,整個系統就可以像是在搭積木一樣對各個服務進行排列組合,如下圖所示:
在上圖中,我們注意到引入了一個分布式服務框架。通過該框架,系統中的醫生服務、患者服務等一系列獨立服務就可以進行合理地編排和整合,從而構建業務 A、業務 B 等不同的業務場景。顯然,分布式服務框架在這里扮演了重要作用,而本小冊后續內容中所要介紹的 Dubbo 和 Spring Cloud 就是目前主流的分布式服務框架。
請注意,分布式系統相較于單體系統而言具備優勢的同時,也存在一些我們不得不考慮的特性,包括以下。
Case 4 :分布式系統的本質特性
網絡傳輸的三態性
我們知道對于單體系統中的函數式方法調用而言,只有“成功”或“失敗”這兩種狀態。但是分布式系統則不同,因為遠程請求是通過網絡進行傳輸的,而網絡在處理請求時還會出現"超時"這個狀態,這樣就相當于有三個狀態。
顯然,網絡傳輸的三態性為系統開發帶來新的挑戰。面對超時狀態,我們不能簡單把它處理成是一種成功或失敗,而是要具體場景具體分析,避免出現請求丟失或請求重復發送現象。在分布式系統設計過程中,我們需要考慮這種由于網絡通信所導致的用戶體驗問題。
請求的容錯性
從錯誤發生的幾率而言,分布式系統顯然比單體系統更加容易出錯,因為系統的調用鏈路變得更長、更復雜。每個分布式服務自身可能會發生異常,而這種異常在整個調用鏈路上會進行擴散,最終可能導致整個系統都不可用。
在分布式系統設計過程中,一大挑戰就是需要確保部分服務的異常情況不會影響到整個系統的可用性。
系統的異構性
分布式系統的異構性很好理解,原則上,每個服務都可以采用一套完全不同的技術體系來進行實現,只要它們對外暴露接口是統一的。但是,因為技術異構性的存在,會增加分布式系統的開發難度和維護成本。
數據的一致性
在分布式系統中,各個服務通常都會構建屬于自身的數據庫,這樣就會導致業務數據無法進行集中管理,也就無法通過傳統的事務機制確保它們之間的一致性。如何實現數據的一致性是分布式系統構建過程的一大難點。
以上幾點是分布式系統的基本特性,我們無法避免,只能想辦法進行利用和管理,這就給我們設計和實現分布式系統提出了挑戰。
結尾
后續不斷更新分布式系列問題 一鍵三連支持一下 后續不迷路 下一文請查看鏈接: 深造分布式 打敗面試官 招式二
總結
以上是生活随笔為你收集整理的深造分布式 打败面试官 招式一 小试牛刀的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络文学5年精品集
- 下一篇: 互联网”还是“技术”?派系分明的电子烟市