單體 V/s 分布式架構(gòu),你看明白了嗎?
在軟件領(lǐng)域,存在多種架構(gòu)風(fēng)格可供選擇,我們需要關(guān)注不同架構(gòu)風(fēng)格帶來的風(fēng)險。選擇符合業(yè)務(wù)需求的架構(gòu)風(fēng)格是一個長期迭代的過程。
架構(gòu)風(fēng)格可以分為兩大主要類型:單體架構(gòu)(將所有代碼部署在一個單元中)和分布式架構(gòu)(通過遠(yuǎn)程訪問協(xié)議連接多個部署單元)。它們又可以進(jìn)一步細(xì)分為以下多個子架構(gòu)風(fēng)格,如下所示。
單體架構(gòu)
- 分層架構(gòu)
- 流水線架構(gòu)
- 微內(nèi)核架構(gòu)
分布式架構(gòu)
- 基于服務(wù)的架構(gòu)
- 事件驅(qū)動架構(gòu)
- 空間驅(qū)動架構(gòu)
- 面向服務(wù)的架構(gòu)
- 微服務(wù)架構(gòu)
后期我將上述每種架構(gòu)風(fēng)格寫一個獨立的博客。這篇將專注于對架構(gòu)風(fēng)格的更廣泛分類,并試圖了解在使用這些架構(gòu)時涉及的優(yōu)缺點。
單體架構(gòu)
當(dāng)從零開始進(jìn)行軟件開發(fā)時,通常會首先采用單體架構(gòu)風(fēng)格。這可能是默認(rèn)選擇或意外選擇,因為在初始階段,架構(gòu)師很難對適當(dāng)?shù)募軜?gòu)風(fēng)格做出決策。對于小型、簡單的應(yīng)用程序或網(wǎng)站,這種架構(gòu)風(fēng)格是一個不錯的選擇。
這種風(fēng)格支持的分層機(jī)制是技術(shù)和領(lǐng)域級別的。以下是在此風(fēng)格中使用的不同分區(qū):
- 展示層 - 負(fù)責(zé)用戶界面和處理用戶輸入。
- 業(yè)務(wù)邏輯 - 執(zhí)行應(yīng)用程序的核心業(yè)務(wù)邏輯。
- 數(shù)據(jù)庫訪問 - 負(fù)責(zé)訪問數(shù)據(jù)庫的數(shù)據(jù)訪問對象。
- 應(yīng)用程序集成 - 與其他服務(wù)進(jìn)行集成(例如通過消息傳遞或REST API)
為什么要使用這種風(fēng)格?
- 小型應(yīng)用程序的不錯選擇。
- 在項目初期非常方便使用。
- 適用于預(yù)算緊張和時間有限的情況。
- 大多數(shù)開發(fā)人員和架構(gòu)師都相當(dāng)簡單和熟悉。
- 成本較低,對于架構(gòu)師在分析業(yè)務(wù)需求和要求時還不確定使用哪種風(fēng)格時是一個不錯的選擇。
為什么不使用這種風(fēng)格?
隨著應(yīng)用程序的增長,可維護(hù)性、敏捷性、可測試性和可部署性等特性會受到不利影響。第二個要注意的因素是架構(gòu)下沉反(sinkhole_ ani)模式,當(dāng)請求在各層之間以簡單的透傳處理方式進(jìn)行傳遞,而在每個層內(nèi)部沒有執(zhí)行任何業(yè)務(wù)邏輯時,這種反模式會出現(xiàn)。
分布式架構(gòu)
分布式架構(gòu)風(fēng)格雖然在性能、可擴(kuò)展性、可部署性和可用性方面比單體架構(gòu)風(fēng)格強(qiáng)大得多,但是為了實現(xiàn)這種強(qiáng)大性能,也存在一些需要權(quán)衡的考慮。
在本節(jié)中,我們將討論與分布式架構(gòu)風(fēng)格相關(guān)的謬論。
謬論:
網(wǎng)絡(luò)可靠。
不能假設(shè)網(wǎng)絡(luò)總是可靠的(最近的電信信號事件)。眾所周知,網(wǎng)絡(luò)隨著技術(shù)的發(fā)展變得更加可靠,但網(wǎng)絡(luò)仍然普遍不可靠。考慮下圖
服務(wù)B可能完全正常,但由于網(wǎng)絡(luò)問題,服務(wù)A無法與其建立聯(lián)系?;蛘吒愀獾氖?,服務(wù)A向服務(wù)B發(fā)送了一個處理請求,由于網(wǎng)絡(luò)問題,沒有收到響應(yīng)。系統(tǒng)越依賴網(wǎng)絡(luò),就越有可能變得不可靠。
延遲為零
在討論網(wǎng)絡(luò)變得更快的觀點時,往往會忽視這個謬論。但是考慮一種情況,即在單體架構(gòu)中,層與層之間的調(diào)用在本地進(jìn)行,延遲只有納秒級,但在切換到分布式架構(gòu)后,本地調(diào)用變?yōu)檫h(yuǎn)程調(diào)用,延遲增加到毫秒級。下面的圖表中進(jìn)行了解釋。
帶寬是無限的
當(dāng)使用單體架構(gòu)風(fēng)格時,這個謬論并不成立,因為組件之間的大部分調(diào)用都是本地方法調(diào)用。但是,當(dāng)系統(tǒng)分布在遠(yuǎn)程位置并需要通過REST調(diào)用進(jìn)行通信時,情況就會發(fā)生變化。
請參考下面的圖表,其中服務(wù)A依賴于服務(wù)B來滿足用戶請求。對于單個請求,這可能是一種不錯的體驗。但是考慮到有數(shù)千個并發(fā)請求針對同一個查詢,這將導(dǎo)致網(wǎng)絡(luò)變慢,間接消耗帶寬,增加調(diào)用之間的延遲。
網(wǎng)絡(luò)是安全的
由于使用了虛擬專用網(wǎng)絡(luò)(VPN)、安全網(wǎng)絡(luò)和可信網(wǎng)絡(luò)等,大多數(shù)軟件人員往往忽視了這個謬論。但是網(wǎng)絡(luò)并不安全,在切換到分布式架構(gòu)時,安全性變得更加具有挑戰(zhàn)性。威脅和攻擊的表面積增加了一個數(shù)量級。
拓?fù)溆肋h(yuǎn)不會改變。
這個謬誤指的是整個網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),包括整個網(wǎng)絡(luò)中使用的所有路由器、集線器、交換機(jī)、防火墻、網(wǎng)絡(luò)和設(shè)備。不要假設(shè)拓?fù)涫枪潭ǖ牟⑶矣肋h(yuǎn)不會改變。事實上,它是會發(fā)生變化的,而且變化是常態(tài)。
只有一個管理員
在分布式架構(gòu)中,從來沒有單一的管理員。架構(gòu)師需要與多個管理員合作和溝通,以維護(hù)整個生態(tài)系統(tǒng)的健康。由于單一部署單元的特性,單體架構(gòu)風(fēng)格不需要這種程度的溝通或協(xié)作。
傳輸成本為零
這里的傳輸成本不是指延遲,而是指與進(jìn)行單個REST調(diào)用相關(guān)的實際成本。與單體架構(gòu)相比,分布式架構(gòu)在硬件、服務(wù)器、網(wǎng)關(guān)、防火墻、新子網(wǎng)、代理等方面的成本要高得多。
網(wǎng)絡(luò)是同質(zhì)的
網(wǎng)絡(luò)并不只由一個網(wǎng)絡(luò)硬件供應(yīng)商構(gòu)成。而且,并非所有這些異構(gòu)的硬件供應(yīng)商之間都能很好地協(xié)同工作。這反過來會影響網(wǎng)絡(luò)的可靠性、延遲以及對帶寬的假設(shè)。