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