1. 程式人生 > >針對架構設計的幾個痛點,我總結出的架構原則和模式

針對架構設計的幾個痛點,我總結出的架構原則和模式

本文來自Firat Atagun的《架構演化中的軟體設計原則》,文中給出了軟體架構演化過程中出現的4種經典架構,就每種架構,分析了其主要特點並在幾個度量維度給出結論。在文章的最後,Firat Atagun給出了4種架構的多維對比。本文的完整演講稿是架構演化中的軟體設計原則

1 分層架構

分層架構是最常見的架構,也被稱為n層架構。多年以來,許多企業和公司都在他們的專案中使用這種架構,它已經幾乎成為事實標準,因此被大多數架構師、開發者和軟體設計者所熟知。

分層架構中的層次和元件是水平方向的分層,每層扮演應用程式中特定的角色。根據需求和軟體複雜度,我們可以設計N層,但大多數應用程式使用3-4層。有太多層的設計會很糟糕,將導致複雜度的上升,因為我們必須維護每一層。在傳統的分層架構中,分層包括表現層、業務或者服務層,以及資料訪問層

。 表現層負責應用程式的使用者互動和使用者體驗(外觀和視覺)。通常我們會使用資料傳輸物件(Data Transfer Object)將資料帶到這一層,然後使用檢視模型(View Model)渲染到客戶端。業務層接收請求並執行業務規則。資料訪問層負責操作各種型別的資料庫,每個訪問資料庫的請求都要經過這一層。

分層無需知道其他層如何去做,比如業務層無需知道資料訪問層是如何查詢資料庫的,相反,業務層在呼叫資料層的特定方法時,只需關注需要部分資料還是全部資料。這就是我們所說的關注點分離。這是非常強大的功能,每層負責其所負的責任。

分層架構中的核心概念是管理依賴。如果我們使用依賴倒置原則和測試驅動開發(Test Driven Development),我們的架構會有更好的健壯性。因為,我們要保證所有可能的用例都有測試用例。

我們需要這樣的冗餘,即使業務層沒有處理業務規則,也要通過業務層來呼叫資料層,這叫分層隔離。對於某些功能,如果我們從表現層直接訪問資料層,那麼資料層後續的任何變動都將影響到業務層和表現層。

分層架構中的一個重要的概念就是分層的開閉原則。如果某層是關閉的,那麼每個請求都要經過著一層。相反,如果該層是開放的,那麼請求可以繞過這一層,直接到下一層。

分層隔離有利於降低整個應用程式的複雜度。某些功能並不需要經過每一層,這時我們需要根據開閉原則來簡化實現。

分層架構是SOLID原則的通用架構,當我們不確定哪種架構更合適的時候,分層架構將是一個很好的起點。我們需要注意防止架構陷入汙水池反模式

。這種反模式描述了請求經過分層,但沒做任何事或者只處理了很少的事。如果我們的請求經過所有分層而沒有做任何事,這就是汙水池反模式的徵兆。如果20%的請求只是經過各層,而80%的請求實際做事,這還好,如果這個比率不是這樣的,那麼我們已經患上反模式綜合徵

此外,分層架構可以演變為巨石應用(Monolith),導致程式碼庫難以維護。

分層架構分析:

  • 敏捷性:總體敏捷性是指對不斷變化的環境作出反應的能力。由於其整體風格(Monolith)的性質,可能會變得難以應對通過所有層的變化,開發者需要注意依賴性和分層分離。
  • 易於部署:大型應用程式的部署會是個麻煩。一個小要求,可能需要部署整個應用程式。如果能做好持續交付,可能會有所幫助。
  • 可測試性:使用Mocking和Faking,每一層可以獨立測試,因此測試上很容易。
  • 效能:雖然分層應用程式可能表現良好,但是因為請求需要經過多個分層,可能會存在效能問題。
  • 可伸縮性:因為耦合太緊以及整體風格(Monolith)的天生特質,很難對分層應用程式進行伸縮。然而,如果分層能夠被構建為獨立的部署,還是可以具備伸縮能力的。但是,這樣做的代價可能很昂貴。
  • 易於開發:這種模式特別易於開發。許多企業採用這種模式。大多數開發者也都知道、瞭解,並且可以輕鬆學習如何使用它。

2 事件驅動架構

事件驅動架構(Event Driven Architecture)是一種流行的分散式非同步架構模式,用於建立可伸縮的應用程式。這種模式是自適應的,可用於小規模或者大規模的應用程式。事件驅動架構可以與調停者拓撲(Mediator Topology)或者代理者拓撲(Broker Topology)一起使用。理解拓撲的差異,為應用程式選擇正確的拓撲是必不可少的。

調停者拓撲

調停者拓撲需要編排多種事件。比如在交易系統中,每個請求流程必須經過特定的步驟,如驗證、訂單、配送,以及通知買家等。在這些步驟中,有些可以手動完成,有些可以並行完成。

通常,架構主要包含4種元件,事件佇列(Event Queue)、調停者(Mediator)、事件通道(Event Channel)和事件處理器(Event Processor)。客戶端建立事件,並將其傳送到事件佇列,調停者接收事件並將其傳遞給事件通道。事件通道將事件傳遞給事件處理器,事件最終由事件處理器處理完成。

事件調停者不會處理也不知道任何業務邏輯,它只編排事件。事件調停者知道每種事件型別的必要步驟。業務邏輯或者處理髮生在事件處理器中,事件通道、訊息佇列或者訊息主題用於傳遞事件給事件處理器。事件處理器是自包含和獨立的,解耦於架構。理想情況下,每種事件處理器應只負責處理一種事件型別。

通常,企業服務匯流排、佇列或者集線器可以用作事件調停者。正確選擇技術和實現能夠降低風險。

代理者拓撲

不像調停者拓撲,代理者拓撲不使用任何集中的編排,而是在事件處理器之間使用簡單的佇列或者集線器,事件處理器知道處理事件的下一個事件處理器。

因其分散式和非同步的性質,事件驅動架構的實現相對複雜。我們需要面對很多問題,比如網路分割槽、調停者失敗、重新連線邏輯等。由於這是一個分散式且非同步的模式,如果你需要事務,那就麻煩了,你得需要一個事務協調器分散式系統中的事務非常難以管理,很難找到標準的工作單位模式。

另一個充滿挑戰的概念是契約。架構師聲稱服務的契約應該預先定義,而應變是非常昂貴的。

事件驅動架構分析

  • 敏捷性:由於事件和事件處理器之間解耦,並且可獨立維護,因此這種模式的敏捷性很高。變化可以快速、輕鬆地完成,而不會影響整個系統。
  • 易於部署:由於架構是解耦的,因此很容易部署。元件可以獨立部署,並且可以在調停者上註冊。部署在代理者拓撲上也相當簡單。
  • 可測試性:雖然獨立測試元件很容易,但測試整個應用程式很有挑戰。因此端到端的測試是很難的。
  • 效能:事件驅動架構效能非常好,因為它是非同步的。此外,事件通道和事件處理器可以並行工作,因為它們是解耦的。
  • 可伸縮性:事件驅動架構的伸縮性非常好,因為元件之間解耦,元件可以獨立擴充套件。
  • 易於開發:這種架構的開發不是很容易。需要明確定義契約,錯誤處理和重試機制得處理得當。

3 微核心架構

微核心架構(Microkernel architecture)模式也被稱為外掛架構(plugin architecture)模式。這是產品型應用程式的理想模式,由兩部分組成:核心系統外掛模組。核心系統通常包含最小的業務邏輯,並確保能夠載入、解除安裝和執行應用所需的外掛。許多作業系統使用這種模式,因此得名微核心。

外掛彼此獨立,因此解偶。核心系統持有註冊器,外掛將自己註冊其上,因此核心系統知道哪裡可以找到它們以及如何執行它們。

這種模式非常適合桌面應用程式,但是也可以在Web應用程式中使用。事實上,許多不同的架構模式可以作為整個系統的一個外掛。對於產品型應用程式來說,如果我們想將新特性和功能及時加入系統,微核心架構是一種不錯的選擇。

微核心架構分析

  • 敏捷性:由於外掛可以獨立開發並註冊到核心系統,微核心架構具有很高的敏捷性。
  • 易於部署:依賴於核心系統的實現,能做到不需要重新啟動整個系統來完成部署。
  • 可測試性:如果外掛開發是獨立的,測試就可以獨立且隔離地進行。還可以Mock核心系統來測試外掛。
  • 效能:這取決於我們有多少外掛在執行,但效能可以調優。
  • 可伸縮性:如果整個系統被部署為單個單元,這個系統將難以擴充套件。
  • 易於開發:這種架構不容易開發。實現核心系統和註冊會很困難,而且外掛契約和資料交換模型增加了難度。

4 微服務架構

儘管微服務的概念還相當新,但它確實已經快速地吸引了大量的眼球,以替代整體應用和麵向服務架構(SOA)。其中的一個核心概念是具備高可伸縮性、易於部署和交付的獨立部署單元(Separately Deployable Units)。最重要的概念是包含業務邏輯和處理流程的服務元件(Service Component)。拿捏粒度設計服務元件是必要而具有挑戰性的工作。服務元件是解耦的、分散式的、彼此獨立的,並且可以使用已知協議來訪問。

微服務的發展是因為整體應用和麵向服務應用程式的缺陷。整體應用程式通常包含緊耦合的層,難以部署和交付。比如,如果應用程式總在每次應對變化時垮掉,這是一個因耦合而產生的大問題。微服務將應用程式分解為多個部署單元,因此很容易提升開發和部署能力,以及可測性。雖然面向服務架構非常強大,具有異構連線和鬆耦合的特性,但是價效比不高。它很複雜、昂貴,難於理解和實現,通常對於大多數應用程式來說矯枉過正。微服務簡化了這種複雜性。

跨服務元件的程式碼冗餘是完全正常的。開發微服務時,為了受益於獨立的部署單元,以及更加容易的部署,我們可以違反DRY原則。其中的挑戰來自服務元件之間的契約,以及服務元件的可用性。

微服務架構分析

  • 敏捷性:由於服務元件可以各自獨立開發,彼此沒有耦合,因此微服務架構具有很高的敏捷性。獨立部署單元能夠對變化作出迅速的反應。
  • 易於部署:相比其他的架構模式,微服務的優勢是服務元件即是單獨部署單元。
  • 可測試性:服務元件的測試可以獨自完成。微服務的可測試性很高。
  • 效能:依賴於服務元件和這種特定模式的分散式性質。
  • 可伸縮性:獨立部署單元天然具備很好的伸縮性。
  • 易於開發:每個服務元件可以各自獨立實現。

編後語

《博文共賞》是InfoQ中文站新推出的一個專欄,精選來自國內外技術社群和個人部落格上的技術文章,讓更多的讀者朋友受益,本欄目轉載的內容都經過原作者授權。文章推薦可以傳送郵件到[email protected]

相關推薦

針對架構設計痛點總結架構原則模式

本文來自Firat Atagun的《架構演化中的軟體設計原則》,文中給出了軟體架構演化過程中出現的4種經典架構,就每種架構,分析了其主要特點並在幾個度量維度給出結論。在文章的最後,Firat Atagun給出了4種架構的多維對比。本文的完整演講稿是架構演化中的軟體設計原則

#程式設計師最常用那鍵?用的是ctrlc、v!

程式設計師是什麼人群,可以在電腦面前坐一天的人,畢竟就是靠電腦吃飯的人。以前就有看過一篇說程式設計師的鍵盤是什麼樣子,比那種職業遊戲玩家的鍵盤還要磨損的厲害,完全看不到鍵盤上的字母,雖說是搞笑的,但是可以說明程式設計師的鍵盤是經過千錘百煉的。 有想學習java的程式設計師,可來我們的java

做開發十年總結了這些開發經驗

裏的 由於 翻譯 一次 吃飯 局部變量 單個 含義 .... 本文由雲+社區發表,原文轉載地址:https://www.cnblogs.com/qcloud1001/p/10218876.html 在一線做了十年的開發,經歷了網易、百度、騰訊研究院、MIG 等

聊聊雲端計算架構設計原則

作者:婁恆 編輯:Sharon 關於“架構”概念的介紹,包括: “事物的組織、結構或格局。”  — 《現代漢語大詞典》 “建築的科學或藝術。” — 《牛津辭典》 “① 建造,構築 ;② 框架,支架。– 《新華詞典》 古羅馬建築師維特魯威提出架構的概念:架構是由功能(實用)、美感(美觀)和結構(

學習Java分為階段分別是什麽?

java hiberna 我不 參加 file類 循環 堆外 read 網絡 多年前我自學的時候是很茫然,上網問問題,總是一堆外行的人說很難啊,你需要這樣需要那樣,不然就是,一堆人說一些空話,多看多寫,買好書,我很無語,除了這些就沒有自己的一些想法嗎? 首先很多人認為學JA

互聯網大咖都要收藏的網站純幹貨

發現 分析 選擇 ppt 咨詢 描述 意思 官方 img 有句俗話說的好:裝逼首選豆瓣,吹牛當然還是上知乎!這句話從側面反映出了網民朋友們在互聯網上的”淘樂樂“的心態!如今,誰的pc上沒有幾個收藏夾,估計沒有的人都會覺得不好意思吧。 如今,大家發現好的網站都會第一時間放到自

電腦配置太低?使用這網站你的電腦軟件要少裝一半!

atp 一周 即使 exc 你們的 不用 過多 電腦軟件 提升 你還在為你的電腦配置太低導致軟件過多而卡頓感到煩惱?還是電腦遊戲太多,無法運行一些其他軟件而不開心?其實不用難過,小編教你們使用一些在線網站,可以輕松的將你的電腦上的軟件少安裝一半!你們準備好了嗎! 一.創客

CSS響應式:根據分辨路加載不同CSS的方法親測可用

響應 col 但是 max-width width media 總結 屏幕 link 有時候你需要把同一個頁面在手機和pc同時打開,其中有一個辦法就是判斷不同分辨路加載不同的css 小編總結了幾種分別加載css的方法: 1.比較復雜的使用js判斷加載不同css (親

互聯網時代眼中的架構變遷

計算 微型機器人 訪問量 water 提取 csdn 優點 常見 代碼 互聯網在變,架構也在變,架構的變遷亦是互聯網的變遷。所以,我們有必要來聊聊互聯網的架構及其變遷。 何為架構?往大的說,宇宙有架構,社會有架構,往小的說,建築要有架構,軟件要有架構,往玄乎的說,它由分工

新公司上班一個月了兩道理不得不服

分享 並不是 默認 特意 最簡 oss 部分 ado 現在 剛從另一家公司裸辭,本來的打算也被突然的事情打斷,自己不是富二代,生活還是要繼續的,不得不找工作了,但是剛上完一個月班,我心中頓時感慨萬千,這社會很現實! 大多數的企業體制都差不多,優點和缺點都有,但哪個更明顯就

快速錄入30Excel表格職場老手用這技巧只花了10分鐘!

職場辦公最怕不會用Excel軟體,一天好多個Excel表格,全部都要快速錄入。新人進入職場都快哭了,怎麼辦?職場老手都在用的這些技巧,效率提升超快!再也不怕工作做不完。大家快趕緊一起學起來啦! 輸入大寫數字 很多職場做會計財務之類的朋友都知道,當Excel表格輸入金額需要用中文大寫輸入時,非常的痛

char、short、long、double佔位元組32位機中

char佔1位元組,short佔 2 位元組,int 、float、long 都佔 4 位元組,double 佔8 位元組 指標長度和地址匯流排有關。因為指標記錄的就是一個地址,那麼32位的就是4位元組,64位的就是8位元組。 發現一個問題,以下程式碼是在win10 64位系統下跑的

用shell指令碼增加並在每個組裡建立一定的使用者

昨天我們用語言寫了一個關於使用者組和使用者的簡單應用,但是說實話,就九個使用者我已經重複的很煩惱了,於是我就想能不能通過shell指令碼來實現批量增加使用者。於是乎,我今天就想著用shell指令碼去完成昨晚的例子。我們先來回顧一下昨天的例子。 題目:建立幾個組,每個組有一定的成員,並且每個組有一個可以操作的

電腦藍屏如何修復?步驟突破極限!讓電腦不再藍屏!

一般使用電腦的朋友大多數都會碰到電腦藍屏的現象,對於一些工作狂人和學生來說電腦藍屏有的時候一兩個小時都開不了電腦,學習工作分分鐘都會受到影響,令人害怕又頭疼,那麼今天我們就來談一談電腦藍屏如何解決,讓你再也不用擔心電腦藍屏!   1.安裝惡意軟體 目前網上很多軟體都會捆綁

分享程式設計師喜歡逛的這網站不知道的話就OUT了!

如果對程式設計感興趣的話,可以通過哪些網站來學習程式設計知識呢?今天就來介紹程式設計師喜歡逛的幾個牛掰的網站,瞭解這些程式設計師每天休閒時間都在看什麼! 1.部落格園 部落格園是一個面向開發者的知識分享社群,可以那麼幫助開發者通過網際網路來分享知識,可以幫助程式設計師通過程式碼來改變

Oracle中關於處理小數點位數的函式取小數位數Oracle查詢函式

關於處理小數點位數的幾個oracle函式() 1. 取四捨五入的幾位小數 select round(1.2345, 3) from dual; 結果:1.235 2. 保留兩位小數,只舍 select trunc(1.2345, 2) from dual; 結果:1.23 select trun

Java程式設計師不可不知的網站你去過

看到網上IT友人積累的網址,非常不錯,不少我也知道,非常值得去學習,特此也借他人幫助記錄一下!!非常感謝!! 轉自:http://ibeginner.sinaapp.com/index.php?m=Home&c=Index&a=detail&i

shell指令碼-保留目錄下最新的檔案其他刪除

#!/bin/bash #保留檔案數 ReservedNum=5 FileDir=/data/bak date=$(date "+%Y%m%d-%H%M%S") FileNum=$(ls -l $FileDir|grep ^- |wc -l) while(( $FileNum &g

阿里架構設計之初體驗送給準備進階架構的朋友(個人總結

1 基本概念和目的 架構設計的目的是為了解決系統複雜度帶來的問題,並不是要面面俱到,不需要每個架構都具備高效能、高可用、高擴充套件等特點,而是要識別出實際業務實際情況的複雜點,然後有有針對性地解決問題,即:有的放矢,而不是貪大求全。 在實際情況中,不一定每個系統都要做架

Airbnb資料科學家:歷時6終於找到了心儀的工作

作者 Kelly Peng 編譯 Mika 本文為 CDA 資料分析師原創作品,轉載需授權 中國小姐姐Kelly Peng在本文分享了她在資料科學求職過程中的心得和體會。 前言 一個月前,我作為資料科學家在Airbnb開始了我的新工作,能夠進入Airbnb,獲得自己心儀的工作我感到很幸運。我曾向Airb