51種企業應用架構模式詳解

01 什么是企業應用

我的職業生涯專注于企業應用,因此,這里所談及的模式也都是關于企業應用的。(企業應用還有一些其他的說法,如“信息系統”或更早期的“數據處理”。)那么,這里的“企業應用”具體指的是什么呢?我無法給出一個精確的定義,但是我可以羅列一些個人的理解。

先舉幾個例子。企業應用包括工資單、患者記錄、發貨跟蹤、成本分析、信用評分、保險、供應鏈、會計、客戶服務以及外匯交易等。企業應用不包括汽車燃油噴射、文字處理、電梯控制、化工廠控制器、電話交換機、操作系統、編譯器以及電子游戲等。

企業應用一般都涉及持久化數據。數據必須持久化是因為程序的多次運行都需要用到它們——實際上,有些數據需要持久化若干年。在此期間,操作這些數據的程序往往會有很多變化。這些數據的生命周期往往比最初生成它們的那些硬件、操作系統和編譯器還要長。在此期間,為了存儲新的信息而不干擾舊的信息,數據的結構經常會發生許多變化。即使是有根本性的變化發生,或公司安裝了一套全新的軟件來處理某項任務,這些數據也必須被“遷移”到新的應用上。

企業應用一般都涉及大量數據——一個中等規模的系統往往都包含1GB以上的數據,這些數據是以數千萬條記錄的方式存在的。巨大的數據量導致數據的管理成為系統的主要工作。早期的系統使用的是索引文件結構,如IBM的VSAM和ISAM。現代的系統往往采用數據庫,絕大多數是關系型數據庫。設計和填充這些數據庫已經成為一個獨立的專業領域。

企業應用一般還涉及很多人并發訪問數據。對于很多系統來說,人數可能在100人以下,但是對于一些通過互聯網進行通信的基于Web的系統,人數則會呈指數級增長。要確保這些人都能夠正確地訪問數據,就一定會存在這樣或那樣的問題。即使人數沒有那么多,要確保兩個人在同時操作同一數據項時不出現錯誤,也是存在問題的。事務管理工具可以處理其中的一些負擔,但是它通常無法做到對應用開發者隱藏。

企業應用還涉及大量操作數據的用戶界面屏幕。有幾百個用戶界面屏幕是不足為奇的。企業應用的用戶從偶爾使用到定期使用都有,他們也經常沒什么技術背景。因此,出于不同的使用目的,數據需要很多種表現形式。系統一般都有很多批處理過程,但當專注于強調用戶交互的用例時,這些批處理過程很容易被忽視。

企業應用很少獨立存在,通常需要與散布在企業周圍的其他企業應用集成。這些各式各樣的系統是在不同時期采用不同技術構建的,甚至連協作機制都不同:COBOL數據文件、CORBA系統或是消息系統。企業經常希望能用一種統一的通信技術來集成所有系統。當然,每次這樣的集成工作幾乎都很難真正實現,所以會有幾個不同的統一集成方案同時存在。當業務組織需要同其業務伙伴進行應用集成時,情況就更糟糕。

即使是某家公司統一了集成技術,它們也還是會遇到業務流程中的差異以及數據中概念的不一致性。一個部門可能認為客戶是當前簽有協議的人,而另外一個部門可能還要將那些以前有合同但現在已經沒有了的人計算在內。再有,一個部門可能只關心產品銷售而不關心服務銷售。粗看起來,這些問題似乎容易解決,但是,一旦幾百條記錄中的每個字段都有可能存在著細微差別,問題的規模就會形成不小的挑戰——就算唯一知道這些字段真正含義的員工還在公司任職(當然,所有這些都會毫無預警地發生變化)。這樣,數據就必須被不停地以各種不同的語法和語義格式讀取、轉換和寫入。

再接下來的問題是由“業務邏輯”帶來的。我認為“業務邏輯”這個詞很滑稽,因為很難再找出什么東西比“業務邏輯”更加沒有邏輯。當我們構建一個操作系統時,總是盡可能地使得系統中的各種事物符合邏輯。而業務規則是人家給你的,沒有相當的行政努力,不要想改變它,當然,它們都有自己的理由。你必須面對很多奇怪的條件,而且這些條件相互作用的方式也非常怪異。比如,某個銷售人員為了簽下其客戶幾百萬美元的一張單,可能會在商務談判中與對方達成協議,將該項目的年度到賬時間推遲兩天,因為這樣才能夠與該客戶的賬務周期相吻合。成千上萬的這類“一次性特殊情況”最終導致了復雜的業務“無邏輯”,使得商業軟件開發那么困難。在這種情況下,必須盡量將這些業務邏輯組織成有效的方式,因為我們可以確定的是,這些“邏輯”一定會隨著時間不斷變化。

在這里插入圖片描述
▲對不同的領域邏輯組織方式,領域邏輯的復雜度和工作量之間的關系示意

對于一些人來說,“企業應用”這個術語指的是大型系統。但是記住這一點很重要:并不是所有的企業應用都是大型的,盡管它們可能都為企業提供巨大的價值。很多人認為,由于小型系統的規模不大,所以不值得為之操心,在某種程度上,這是合理的。如果一個小型系統失敗了,它通常不會像大型系統那樣引起廣泛關注。但是,我認為這種思想沒有對小型項目的累積效應給予足夠的重視。試想,如果在小型項目上能夠進行某些改善措施,那么這種累積效應對企業的影響是非常顯著的,特別是因為小型項目通常具有不成比例的價值。實際上,你可以做的最好的事情之一是通過簡化架構和過程,將一個大型項目變成小型項目。

02 企業應用的種類

在我們討論如何設計企業應用以及使用哪些模式之前,認識到這一點很重要:企業應用是多種多樣的,不同的問題將導致不同的處理方法。如果有人說,“總是這樣做”的時候,就應當敲響警鐘了。我認為,設計中最具挑戰性(也是我最感興趣)的地方就是了解有哪些候選的設計方案以及各種不同設計方案之間的優劣比較。進行選擇的空間很大,但我在這里只選三個方面。

考慮一個B2C(Business to Customer)的在線零售商:人們瀏覽和——運氣好,還有購物車——購買。這樣一個系統必須能夠應付大量的用戶,因此,其解決方案不但要考慮到資源利用的高效,還要考慮到系統的可伸縮性,以便在用戶規模增大時能夠通過增加硬件的辦法加以解決。這樣的應用的領域邏輯可能非常直接:獲取訂單,進行簡單的價格計算和發貨計算,給出發貨通知。我們希望任何人都能夠輕松訪問該系統,因此用戶界面可以選用通用的Web表現方式,以支持各種不同的瀏覽器。數據源包括用來存放訂單的數據庫,還可能包括某種與庫存系統的通信交流,以便獲得商品的可用性信息和發貨信息。

再考慮一個租約自動處理系統。在某些方面,這樣的系統比起前面介紹的B2C零售商系統要簡單得多,因為它的用戶數很少(在特定時間內不會超過100個),但是它的業務邏輯卻比較復雜。計算每個租約的月供,處理諸如提早解約和逾期付款這樣的事件,簽訂合同時驗證各種數據,這些都是復雜的任務,因為租約行業的許多競爭都是以過去的交易為基礎稍加變化而出現的。正是因為規則的隨意性很大,才使得像這樣一個復雜的業務領域具有挑戰性。

這樣的系統在用戶界面(UI)上也更加復雜。這就要求HTML界面要能提供更豐富的功能和更復雜的屏幕,而這些要求往往是HTML前端目前無法達到的,需要更傳統的富客戶界面。用戶交互的復雜性還會帶來事務行為的復雜性:簽訂租約可能要耗時1~2小時,這期間用戶要處于一個邏輯事務中。一個復雜的數據庫設計方案中可能也會涉及200多個表以及一些有關資產評估和計價的軟件包。

第三個例子是一家小型公司使用的簡單的“開支跟蹤系統”。這個系統的用戶很少,邏輯簡單,并且可以通過HTML表示輕松地在整個公司訪問,唯一的數據源是數據庫中的幾個表。盡管如此,開發這樣的系統也不是沒有挑戰。一方面你必須快速地開發出它,另一方面你又必須為它以后可能的發展考慮:也許以后會為它增加計算報銷支票的功能,也許它會被集成到工資系統中,也許還要增加關于稅務的功能,也許要為公司的CFO生成匯總報表,也許會被集成到一個航空訂票Web Service中,等等。如果在這個系統的開發中,也試圖使用前面兩個例子中的一些架構,可能會影響開發進度。如果一個系統會帶來業務效益(如所有的企業應用應該的那樣),則系統進度延誤同樣也是開銷。你不希望現在做出的決策會阻礙未來的發展。但是,如果現在就考慮了這些靈活性但是考慮不得當,額外的復雜性又可能會讓系統在未來變得更難演化,進一步延誤系統部署,減少系統的效益。雖然這類系統很小,但是一個企業中往往有很多這樣的系統,這些系統的架構不良性累積起來,后果將會非常可怕。

這三個企業應用的例子都有難點,而且難點各不相同。當然,也不可能有一個適合于三者的通用架構。選擇架構時,必須很清楚地理解系統的特定問題,在理解的基礎上再來選擇合適的設計

03 企業架構模式

模式的概念早就有了。我在這里不想把這段歷史重新演繹一遍。只是想簡單談談我對模式和它們為什么是描述設計的重要手段的一些看法。

模式沒有統一的定義,可能最好的起點是Christopher Alexander給出的定義(這也是許多模式狂熱者的靈感來源):

“每一個模式描述了一個在我們周圍不斷重復發生的問題以及該問題解決方案的核心。這樣,你就能一次又一次地使用該方案而不必做重復勞動”[Alexander
et al.]。

盡管Alexander是建筑家,他談論的是建筑模式,但其定義也能很好地適用于軟件業。模式的核心就是特定的解決方案,它有效而且有足夠的通用性,能解決重復出現的問題。模式的另一種視角是把它看成一組建議,而創造模式的藝術則是將很多建議分解開來,形成相互獨立的組,在此基礎上可以相對獨立地討論它們。

模式的關鍵點是它們源于實踐。必須觀察人們的工作過程,發現其中好的設計,并找出“這些解決方案的核心”。這并不是一個簡單的過程,但是一旦發現了某個模式,它將是非常有價值的。

一旦需要使用模式,就必須知道如何將它運用于當前的問題。使用模式的關鍵之一是不能盲目使用,這也是模式工具為什么都那么慘。我認為模式是一種“半生不熟品”,為了用好它,還必須在自己的項目中把剩下的那一半“火候”補上。我本人每次在使用模式時,都會東改一點西改一點。因此你會多次看到同一個解決方案,但沒有一次是完全相同的。

每個模式相對獨立,但又不彼此孤立。有時候它們相互影響,如影隨形。

《企業應用架構模式》一書中總結出的51種模式:

在這里插入圖片描述

如果你是一個有經驗的企業應用設計師,也許會對大多數模式都很熟悉。模式不是什么新鮮概念。因此,撰寫模式書籍的作者也不會聲稱我們“發明”了某某模式,而是說我們“發現”了某某模式。我們的職責是記錄通用的解決方案,找出其核心,并把最終的模式記錄下來。對于一個高級設計師,模式的價值并不在于它給予你一些新東西,而在于它能幫助你更好地交流。如果你和你的同事都明白什么是遠程外觀,你就可以這樣非常簡捷地交流大量信息:“這個類是一個遠程外觀模式。”也可以對新人說:“用數據傳輸對象模式來解決這個問題。”模式為設計提供了一套詞匯,這也是模式的名字如此重要的原因。

當你使用模式時請記住:它們只是開始,而不是結束。任何作者去囊括項目開發中的所有變化和技術是不可能的。我編寫《企業應用架構模式》一書的目的也只是作為一個開始,希望它能夠把我自己的和我所了解的經驗和教訓傳遞給讀者,你們可以在此基礎上繼續努力。請大家記住:所有模式都是不完備的,你們都有責任在自己的系統中完善它們,你們也會在這個過程中得到樂趣。

在這里插入圖片描述

關于作者:

馬丁·福勒(Martin Fowler),世界著名軟件開發大師,Thoughtworks首席科學家,從事軟件開發相關工作30余年,是全球軟件架構、敏捷開發、極限編程、設計模式等多個領域的領袖人物。此外,他在面向對象分析與設計、UML、數據庫、領域特定語言等領域也有深厚的積累和卓越的貢獻。

📚 京東購買鏈接:《企業應用架構模式》

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/22065.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/22065.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/22065.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[原型資源分享]經典產品餓了么UI模版部件庫

?部件庫預覽鏈接:https://f13gm0.axshare.com 支持版本: Axrure RP 8 文件大小: 3MB 文檔內容介紹 基本部件:表單樣式:12款、數據樣式:10款、服務樣式:6款、導航:5款、業務組件:7款、 模板…

python把簡體中文轉換為繁體中文

Python 可以使用第三方庫來將簡體中文(簡體中文)轉換為繁體中文(繁體中文)。一個常用的庫是 opencc-python-reimplemented,它是 Open Chinese Convert (OpenCC) 的 Python 實現,OpenCC 是一個開源的中文簡繁…

MySQL之查詢性能優化(三)

查詢性能優化 重構查詢的方式 在優化有問題的查詢時,目標應該是找到一個更優的方法獲得實際需要的記過——而不是一定總是需要從MySQL獲取一模一樣的結果集。有時候,可以將查詢轉換一種寫法讓其返回一樣的結果,但是性能更好。但也可以通過修…

Python魔法之旅-魔法方法(14)

目錄 一、概述 1、定義 2、作用 二、應用場景 1、構造和析構 2、操作符重載 3、字符串和表示 4、容器管理 5、可調用對象 6、上下文管理 7、屬性訪問和描述符 8、迭代器和生成器 9、數值類型 10、復制和序列化 11、自定義元類行為 12、自定義類行為 13、類型檢…

在Debian系統上賦予普通用戶ping 權限

在Debian系統上,普通用戶默認情況下沒有權限使用 ping 命令,因為它需要發送 ICMP 包,這通常需要 root 權限。為了允許普通用戶使用 ping,可以設置 ping 命令的 setuid 位。以下是具體的步驟: 查找 ping 命令的位置&am…

2024年度自貢市社會民生重大科技計劃項目申報要求、時間流程

一、申報要求 申報項目需符合以下申報要求和申報指南要求,申報資料需在“自貢市科技綜合業務服務平臺”中的“自貢市重點科技計劃項目管理系統”上傳。 (一)項目申報單位要求。 1.項目申報單位包括項目牽頭單位和項目合作單位。 2.多家單…

【Python】pyinstaller打包時添加詳細信息

在要被打包的py文件同級目錄新建version.txt,寫入以下內容 # UTF-8 # # For more details about fixed file info ffi see: # http://msdn.microsoft.com/en-us/library/aa381058.aspx # VSVersionInfo(ffiFixedFileInfo(filevers(1, 4, 0, 5),prodvers(1, 4, 0, 5…

SpringBoot使用RabbitMQ實現延遲隊列

SpringBoot使用RabbitMQ實現延遲隊列 需求和目標名詞解釋實現方式引入依賴添加配置文件配置類死信隊列消費者即時隊列消費者延遲消息發送結果注意 需求和目標 商城系統,用戶下單后若15分鐘內仍未完成支付,則自動取消訂單,若已支付&#xff0c…

重組蛋白的定量定性方法,你了解嗎?

重組蛋白的定量和定性分析是蛋白質工程和生物技術中至關重要的步驟,用于確保蛋白質的表達、純度和功能性符合預期。以下是小編整理的一些常用的方法以及實驗介紹,希望這些方法幫助研究人員詳細了解重組蛋白的特性。 主要的定性方法 1 WB(Wes…

AIGC 011-SAM第一個圖像分割大模型-分割一切!

AIGC 011-SAM第一個圖像分割大模型-分割一切! 文章目錄 0 論文工作1論文方法2 效果 0 論文工作 這篇論文介紹了 Segment Anything (SA) 項目,這是一個全新的圖像分割任務、模型和數據集。SA 項目是一個具有里程碑意義的工作,它為圖像分割領域…

基于springboot的多媒體素材庫源碼數據庫

基于springboot的多媒體素材庫源碼數據庫 近年來,信息化管理行業的不斷興起,使得人們的日常生活越來越離不開計算機和互聯網技術。首先,根據收集到的用戶需求分析,對設計系統有一個初步的認識與了解,確定多媒體素材庫…

迎七一黨史知識競賽答題怎么做

迎七一黨史知識競賽答題,不僅是對于黨史知識的檢驗,更是對于參賽者學習態度和綜合能力的考量。在參與這類競賽時,我們需要做好充分的準備,掌握一定的答題技巧,才能取得好的成績。 首先,我們要深入了解競賽…

FFmpeg播放器的相關概念【1】

播放器框架 相關術語 ?容器/文件(Conainer/File):即特定格式的多媒體文件,比如mp4、flv、mkv等。 ? 媒體流(Stream):表示時間軸上的一段連續數據,如一段聲音數據、一段…

UFS Explorer Professional Recovery: 如何從啟用了 mSATA 緩存的 Drobo 設備中恢復數據

天津鴻萌科貿發展有限公司是 UFS Explorer Professional Recovery 數據恢復軟件的授權代理商。 UFS Explorer Professional Recovery 數據恢復軟件提供綜合性的解決方案,用于解決復雜的數據恢復案例,包括那些采用特殊存儲技術的案例,或介質受…

上海亞商投顧:創業板指震蕩收漲 超70家ST股跌停

上海亞商投顧前言:無懼大盤漲跌,解密龍虎榜資金,跟蹤一線游資和機構資金動向,識別短期熱點和強勢個股。 一.市場情緒 滬指昨日震蕩震蕩,創業板指走勢稍強,盤中一度漲超1%,黃白二線分化嚴重。算…

vue ts 導入 @/assets/ 紅色顯示的問題解決

vue ts 導入 /assets/ 紅色顯示的問題解決 一、問題描述 在使用的時候這樣導入會出現如上的錯誤。 在使用的時候,導入的類型也沒有對應的代碼提示,說明導入有問題。 二、解決 在 tsconfig.json 中添加如下內容: {"compilerOptions&…

AI大模型探索之路-實戰篇15: Agent智能數據分析平臺之整合封裝Tools和Memory功能代碼

系列篇章💥 AI大模型探索之路-實戰篇4:深入DB-GPT數據應用開發框架調研 AI大模型探索之路-實戰篇5:探索Open Interpreter開放代碼解釋器調研 AI大模型探索之路-實戰篇6:掌握Function Calling的詳細流程 AI大模型探索之路-實戰篇7…

模式識別判斷題

貝葉斯估計的方法類似于貝葉斯決策,也需要定義損失函數。(正確) 解釋:貝葉斯估計是一種基于貝葉斯定理的參數估計方法,它在估計參數時考慮了參數的先驗分布。與貝葉斯決策類似,貝葉斯估計也需要定義損失函數…

46.ThreadPoolExcutor接口

線程池狀態 ThreadPoolExcutor使用int高3位來表示線程池狀態,低29位表示線程數量 狀態高三位接收新任務處理阻塞隊列任務說明RUNNING111YYSHUTDOWN000NY不會接收新任務,但會處理阻塞隊列剩余任務,比較溫和,已經提交的任務都會執…

15.1 測試-重要性與testing包

1. 測試的重要性 1.1 單元測試 單元測試是針對一小部分代碼進行獨立地測試。 單元測試的對象通常是單個函數或方法,而要測試的是它在接受給定的輸入后,能否產生符合預期的輸出。 單元測試的作用主要表現在以下兩個方面: 驗證程序的最小…