淺談架構模式變遷之從分層架構到微服務架構
前言
談到軟件系統(tǒng)設計的方法論,在代碼層面,有我們熟悉的23種設計模式(design pattern),對應到架構層面,則有所謂的架構模式(architecture pattern)。它們分別從微觀和宏觀的角度指導著我們設計出良好的軟件系統(tǒng),因此,作為一個軟件工程師,我們不僅要熟悉設計模式,對常見的架構模式也要熟稔于心。正如看到一個設計模式的名字腦里就能浮現(xiàn)出大致的結構圖,當我們看到一個架構模式的名字時,也要馬上想到對應的架構圖及其基本特點。比如,當談到分層架構時,我們就應該想起它的架構圖是怎樣的、有哪些出色的架構特征(architecture characteristics)、系統(tǒng)是如何部署的、數(shù)據(jù)存儲的策略是哪種、等等。
一般地,架構模式大致可以分成兩類,單體架構(monolithic architecture)和分布式架構(distributed architecture)。本系列文章將會介紹以下8種常用的架構模式:
單體架構
分層架構(Layered architecture)
管道架構(Pipeline architecture)
微內核架構(Microkernel architecture)
分布式架構
基于服務的架構(Service-based architecture)
事件驅動架構(Event-driven architecture)
基于空間的架構(Space-based architecture)
面向服務的架構(Service-oriented architecture)
微服務架構(Microservices architecture)
軟件設計中的謬誤
在介紹架構模式前,我們先談談軟件設計中的謬誤(fallacy)。所謂謬誤,就是在設計軟件系統(tǒng),特別是分布式系統(tǒng)時,我們先入為主地假設它們是正確,但實際上并非如此的一些觀念。這些觀念都是我們在設計軟件時考慮不周的體現(xiàn)。
謬誤1:網(wǎng)絡是可靠的
網(wǎng)絡是不可靠的
很多軟件工程師常常假設網(wǎng)絡是可靠的,但實際并非如此。相比20年前,現(xiàn)在的網(wǎng)絡會可靠很多,但是仍然具有很大的不確定性。如上圖所述,Serivce B可能完全是正常運行的,但是因為網(wǎng)絡的問題,Service A發(fā)出的請求無法到達Service B。一種更糟糕的場景是,Service B可以收到Service A的請求,并處理了相關的數(shù)據(jù),但是網(wǎng)絡問題導致了Service A無法收到Service B的響應,從而造成了數(shù)據(jù)不一致。網(wǎng)絡的不可靠也是為什么系統(tǒng)中常常出現(xiàn)服務通信超時、服務熔斷等的原因。
總而言之,如果假設網(wǎng)絡是可靠的,那么我們設計出來的軟件系統(tǒng)將會是不可靠的。
謬誤2:時延是0
時延不為0
如上圖所示,服務內組件間的函數(shù)/方法級別的調用,耗時是微秒,甚至是納秒級別;但是服務間的遠程調用(比如REST、消息隊列、RPC),耗時會是毫秒級別,甚至在異常場景會達到了秒級!在設計系統(tǒng),特別是分布式系統(tǒng)時,時延是一個無法被忽視的因素,我們必須清楚系統(tǒng)的平均時延,否則設計出來的方案可能根本不可行。比如,假設系統(tǒng)中服務間通信時延為100ms,如果一個請求的調用鏈涉及到10個服務,那么該請求的時延將會是1000ms!這么高的平均時延對于一般系統(tǒng)來說是完全無法接受的。
進行系統(tǒng)設計時,考慮平均時延還不夠,更重要的是95th和99th百分點。一個系統(tǒng)的平均時延可能僅僅只有數(shù)十毫秒,但是95th百分點的時延卻達到了數(shù)百毫秒,很多時候,這也恰恰成為了拖垮整系統(tǒng)性能的那塊“短板”。
謬誤3:帶寬是無限的
帶寬是有限的
在單體架構中,業(yè)務流程都在單服務內閉環(huán),消耗的帶寬很少甚至為0,因此帶寬并不是主要關注點。一旦將系統(tǒng)拆分成分布式架構,一個業(yè)務流程可能涉及多個服務間的通信,帶寬就成了必須考慮的因素。帶寬的不足,會導致網(wǎng)絡變慢,從而影響系統(tǒng)的時延(謬誤2:時延是0)和可靠性(謬誤1:網(wǎng)絡是可靠的)。
如上圖所示,假設在一個Web系統(tǒng)中,Service A負責處理前端請求,Service B負責管理用戶信息(包括姓名、性別、年齡等45個屬性)。Service A每處理一個請求都需要向Service B查詢用戶姓名(200 bytes),而在一次請求中,Service B卻返回了用戶的所有信息(500 kb)。如果系統(tǒng)每秒處理2000次請求,每次請求消耗500 kb帶寬,那么每秒消耗的總帶寬會是1 Gb!如果Service B僅僅返回必須的姓名,那么同等條件下,每秒消耗的總帶寬僅僅是400 kb。
此類問題就是所謂的stamp coupling,解決方法也很多,比如在請求中添加屬性選擇,使用GraphQL替代REST。相比于這些技術手段,更重要的是確定服務間通信所需的最小數(shù)據(jù)集,并在進行系統(tǒng)設計時將其作為一個重點關注的因素。
謬誤4:網(wǎng)絡是安全的
網(wǎng)絡是不安全的
VPN、防火墻等的廣泛使用,使得很多工程師在設計系統(tǒng)時忽略了“網(wǎng)絡是不安全的”這一重要原則。特別是從單體架構演進到分布式架構以后,系統(tǒng)被攻擊的概率將會大大增加。因此,在分布式系統(tǒng)中,每個服務都必須是安全的endpoint,這樣才能確保任何未知或惡意的請求都被攔截掉。當然,安全是有代價的,這也是像微服務架構這類細服務粒度的系統(tǒng),一次業(yè)務請求中調用鏈過長后性能極速下降的重要原因。
謬誤5:網(wǎng)絡拓撲一成不變
網(wǎng)絡拓撲是時常變化的
這里的網(wǎng)絡拓撲指的是系統(tǒng)運行時所涉及到的網(wǎng)絡設備,包括所有的路由器、防火墻、集線器、交換機等。很多工程師會假設網(wǎng)絡拓撲是固定的,然而并非如此。
假設如下場景,為架構師的你在周一早上回到公司后,發(fā)現(xiàn)組內同事都在為系統(tǒng)中所有的服務間通信都在不斷出現(xiàn)響應超時現(xiàn)象而抓狂,但奇怪的是周末并沒有做服務變更。經(jīng)過幾個小時的攻關后,你發(fā)現(xiàn)周一凌晨2點時有過一次網(wǎng)絡升級,而恰恰是這次“次要”的網(wǎng)絡升級,推翻之前設計系統(tǒng)時的時延假設,從而觸發(fā)了本次事故。
因此,軟件工程師也需要與網(wǎng)絡管理員時常聯(lián)系,確保在每次網(wǎng)絡升級前都明確網(wǎng)絡拓撲的變更點,從而做出相應的調整。
謬誤6:只有一個網(wǎng)絡管理員
不只有一個網(wǎng)絡管理員
網(wǎng)絡管理員往往不止有一個,特別是在“云”時代,數(shù)據(jù)中心分散在多個地域,理所當然也存在著多個局域網(wǎng)。運行在“云”上的系統(tǒng)很有可能跨越多個數(shù)據(jù)中心,因此工程師們應當感知各個數(shù)據(jù)中心的網(wǎng)絡管理員對網(wǎng)絡的相關操作,提前做出應對措施,避免出現(xiàn)因網(wǎng)絡拓撲變更(謬誤5:網(wǎng)絡拓撲一成不變)而導致的服務通信超時,甚至觸發(fā)服務熔斷。
謬誤7:通信成本為0
通信成本不為0
這里的通信成本并非指網(wǎng)絡時延,而是指每增加一次服務間調用所導致的錢的花銷。很多工程師在設計系統(tǒng)時常常忽視掉通信成本,大家都在鼓吹分布式架構相對了單體架構的優(yōu)越性,卻忘記了它帶來的服務器、防火墻、網(wǎng)關等硬件的數(shù)量增加,這些都是白花花的銀子。
因此,在進行系統(tǒng)設計時,我們也應該將硬件資源和網(wǎng)絡拓撲納入考慮因素。
謬誤8:網(wǎng)絡是同質的
網(wǎng)絡并非同質的
很多工程師都會假設網(wǎng)絡是同質的,也就是所有的網(wǎng)絡設備都來自同一硬件廠商,這當然也是一個謬誤。實際上,一個大的通信網(wǎng)絡中,硬件設備往往來自于不同的廠商,這得益于網(wǎng)絡協(xié)議標準的統(tǒng)一。廠商間設備的協(xié)作測試畢竟不會太充分,在一些特殊場景下極有可能存在網(wǎng)絡丟包,從而影響了網(wǎng)絡的可靠性(謬誤1:網(wǎng)絡是可靠的)、時延(謬誤2:時延是0)以及帶寬(謬誤3:帶寬是無限的)。
一切從“大泥球”開始
“大泥球”架構
“大泥球”架構是著名的反模式架構,最初在1997年由Brian Foote 和 Joseph Yoder提出。在“大泥球”架構里,系統(tǒng)沒有進行內部的模塊劃分,代碼耦合嚴重,調用關系混亂,就像一個大的泥球。如上圖所示,每一個點代表一個類,紅線則表示類之間的耦合關系。這樣的架構對需求變更極不友好,往往牽一發(fā)而動全身,而且在部署、可測試性、性能等方面也存在著很多問題。所有的架構師都在極力避免“大泥球”的出現(xiàn),但很不幸的是,它仍然在實際項目中很常見,特別是項目伊始,代碼質量和結構還沒被嚴格管控起來前。
有反模式的出現(xiàn),必然就有解決它的方法,這便是架構模式,從下一篇文章開始,我們將逐個介紹常見的8種架構模式。
總結
跟設計模式類似,架構模式是軟件工程師們多年來在架構設計方面的經(jīng)驗總結。每種架構模式并沒有絕對的優(yōu)劣之分,我們不能說微服務架構就一定比單體分層架構優(yōu)越,它們都有著各自的應用場景。分布式架構比單體架構有著更好的可擴展性、容錯性,但也帶來了更高的復雜性,比如分布式事務。因此,我們應該熟知各個架構模式的特點,這樣才能在特定的業(yè)務場景使用合適的架構模式。
以上就是淺談架構模式變遷之從分層架構到微服務架構的詳細內容,更多關于架構模式變遷之從分層架構到微服務架構的資料請關注腳本之家其它相關文章!
相關文章
詳解windows 環(huán)境下搭建electricSearch+kibana
這篇文章主要介紹了windows 環(huán)境下搭建electricSearch+kibana,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-05-05Cordova插件實現(xiàn)JavaScript與Java的通信的詳細過程
本文將結合最常用的華為推送服務Cordova插件,介紹HMS Core用到的JS-Java消息交互方式,講解在JS側如何調用Java側接口,最終實現(xiàn)HMS Core能力,感興趣的朋友一起學習下吧2021-06-06git merge --ff/--no-ff/--ff-only 三種選項參數(shù)的區(qū)別解析
這篇文章主要介紹了git merge --ff/--no-ff/--ff-only 三種選項參數(shù)的區(qū)別解析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04chrome開發(fā)者助手插件v2.10發(fā)布提升開發(fā)效率不再只是口號
這篇文章主要介紹了chrome開發(fā)者助手插件v2.10發(fā)布提升開發(fā)效率不再只是口號,這個版本重點提升了常用工具的使用效率,需要的朋友可以參考下2021-03-03