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