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