Software Architecture Patterns翻譯

最近再看阮一峰的一篇博客提到了一本書《Software Architecture Patterns》PDF
,寫的不錯(cuò),雖然英語很屎,過年找點(diǎn)事干,試著翻(gu)譯(ge)一下.以下為翻譯的內(nèi)容,祝我能夠翻譯完,并借此機(jī)會(huì)能夠加深對(duì)架構(gòu)的認(rèn)識(shí)。

Software Architecture Patterns 封面

ps:建議看英文原著。
ps:[ ]中的話是我說的。
ps:好吧,我找到已經(jīng)有一個(gè)翻譯版本了(https://github.com/hehonghui/android-tech-frontier/tree/master/software-architecture-patterns)
早看到就不翻譯了......

參考:
阮一峰的博客
鳥窩的博客


介紹

開發(fā)人員在沒有合適架構(gòu)的情況下開始編寫程序是非常普遍的情況. 在這種情況下,大多數(shù)開發(fā)人員和架構(gòu)師會(huì)采用傳統(tǒng)分層架構(gòu)模式(也稱為n層架構(gòu)),通過將源碼模塊分成各種包來表示抽象層。不幸的是,這種做法經(jīng)常導(dǎo)致的是一個(gè)混亂的源碼結(jié)構(gòu),它們?nèi)狈γ鞔_的角色,職責(zé)和彼此之間的關(guān)系。 這通常被稱為反模式的大泥球。

沒有通過架構(gòu)設(shè)計(jì)的應(yīng)用程序通常緊密耦合,脆弱,難以改變,沒有清晰結(jié)構(gòu)。如果沒有完全理解系統(tǒng)中的每個(gè)組件和模塊的內(nèi)部工作原理的情況下,確定程序的架構(gòu)特性會(huì)是非常困難的事情。關(guān)于程序部署和維護(hù)的基本問題也會(huì)很難回答:架構(gòu)是否具有可擴(kuò)展性?應(yīng)用程序的性能如何? 程序是否能夠應(yīng)對(duì)變化?程序如何部署?架構(gòu)的響應(yīng)能力如何?

架構(gòu)模式有助于定義應(yīng)用程序的基本特征和行為。 例如,一些架構(gòu)模式非常適合需要高可擴(kuò)展性的應(yīng)用程序,一些架構(gòu)模式則適用于非常靈活的應(yīng)用程序。 只有了解各種架構(gòu)模式的優(yōu)勢(shì)和弱點(diǎn),才能夠選擇出滿足自己業(yè)務(wù)特點(diǎn)和目標(biāo)的架構(gòu)模式。

作為一個(gè)架構(gòu)師,你必須證明你的架構(gòu)決策,特別是當(dāng)涉及到選擇一個(gè)特定的架構(gòu)模式或方法。 這篇文正的目的是為您提供足夠的信息,以證明你的選擇是OK的。

1.分層架構(gòu)(Layered Architecture)

分層架構(gòu)是最常見的架構(gòu),也是javaee應(yīng)用程序的標(biāo)準(zhǔn)模式,并被多數(shù)開發(fā)人員了解。這種架構(gòu)適合于傳統(tǒng)IT通信和組織結(jié)構(gòu),成為大多數(shù)業(yè)務(wù)應(yīng)用程序開發(fā)工作的自然選擇。

模式描述(Pattern Description)

該架構(gòu)中每一層都包含多個(gè)組件并且擁有具體的職責(zé)(例如顯示邏輯、業(yè)務(wù)邏輯)。該架構(gòu)并不嚴(yán)格規(guī)定層的類型和層數(shù),多數(shù)分層架構(gòu)包含視圖層、業(yè)務(wù)層、持久化層和數(shù)據(jù)庫層(圖1-1)。有時(shí),業(yè)務(wù)層和持久層被合并為單個(gè)業(yè)務(wù)層,特別是當(dāng)持久性邏輯(例如,生成SQL或HSQL)嵌入到業(yè)務(wù)層組件中。因此,較小的應(yīng)用可以僅具有三個(gè)層,而大的應(yīng)用可以包含五個(gè)或更多個(gè)層[對(duì)于多數(shù)應(yīng)用四層足以]。


圖1-1 分層架構(gòu)

分層架構(gòu)模式的每一層在應(yīng)用程序中都有特定的角色和職責(zé)。例如,表示層將負(fù)責(zé)處理所有的用戶界面邏輯,而業(yè)務(wù)層負(fù)責(zé)響應(yīng)表示層的請(qǐng)求并執(zhí)行相應(yīng)的業(yè)務(wù)邏輯。架構(gòu)中的每一層都圍繞需要完成的工作形成抽象,以滿足特定的業(yè)務(wù)請(qǐng)求。例如,表示層不需要知道或擔(dān)心如何獲得客戶數(shù)據(jù);它只需要在特定格式的屏幕上顯示該信息。類似地,業(yè)務(wù)層不需要關(guān)心如何格式化客戶數(shù)據(jù)以在屏幕上顯示或者甚至在客戶數(shù)據(jù)來自哪里;它只需要從持久層獲得數(shù)據(jù),對(duì)數(shù)據(jù)執(zhí)行業(yè)務(wù)邏輯(例如,計(jì)算值或聚合數(shù)據(jù)),并將該信息傳遞到表示層。

分層架構(gòu)模式的一個(gè)強(qiáng)大的功能是組件之間的關(guān)注點(diǎn)分離(separation of concerns)。 特定層中的組件僅處理與該層相關(guān)的邏輯。 例如,表示層中的組件只處理表示邏輯,而業(yè)務(wù)層的組件只處理業(yè)務(wù)邏輯。 這種組件分類方式使您可以輕松地在您的架構(gòu)中構(gòu)建有用的模型,并且由于定義明確的組件接口和有限的組件范圍,還可以輕松地使用此架構(gòu)模式開發(fā),測(cè)試,管理和維護(hù)應(yīng)用程序。

關(guān)鍵概念(Key Concepts)

在圖1-2中,架構(gòu)中的每個(gè)層都標(biāo)記為封閉。這是分層架構(gòu)模式中非常重要的概念。 關(guān)閉意味著當(dāng)請(qǐng)求從一個(gè)層移動(dòng)到另一個(gè)層時(shí),它必須經(jīng)過它的下層,才能到達(dá)目的層。 例如,一個(gè)請(qǐng)求從表示層要到數(shù)據(jù)庫層就必須經(jīng)過業(yè)務(wù)層和持久層。

圖1-2 關(guān)閉層和請(qǐng)求訪問

那么為什么不允許表示層直接訪問持久層或數(shù)據(jù)庫層? 畢竟,從表示層的直接數(shù)據(jù)庫訪問比通過一堆不必要的層來檢索或保存數(shù)據(jù)庫信息要快得多。 這個(gè)問題的答案在于一個(gè)被稱為隔離層(layers of isolation)的關(guān)鍵概念。

隔離層意味著在一個(gè)層的變化通常不會(huì)影響到其它層的組件。 如果你允許表示層直接訪問持久層,那么持久層的變化將會(huì)同時(shí)影響業(yè)務(wù)層和表示層, 從而產(chǎn)生了非常緊密耦合和組件之間的依賴性。當(dāng)需求發(fā)生變化時(shí),這種架構(gòu)將會(huì)付出較大的代價(jià)。

隔離概念的層還意味著每個(gè)層獨(dú)立于其他層,并且不需要知道其它層是如何工作的。 為了理解這個(gè)概念的重要性,考慮一個(gè)大規(guī)模的重構(gòu),將展示框架從JSP(Java服務(wù)器頁面)修改為JSF(Java服務(wù)器面。假設(shè)在表示層和業(yè)務(wù)層之間使用的契約(contracts)(例如,模型)保持相同,則業(yè)務(wù)層不受重構(gòu)的影響并且完全和表示層保持獨(dú)立。

雖然封閉的層有助于層次之間的隔離,從而提高了架構(gòu)的低耦合設(shè)計(jì),但有時(shí)候某些層被打開是有意義的。 例如,假設(shè)您要增加一個(gè)共享服務(wù)層向業(yè)務(wù)層的組件提供服務(wù)(例如,數(shù)據(jù)和字符串實(shí)用程序類或?qū)徲?jì)和日志記錄類)。 在這種情況下創(chuàng)建服務(wù)層通常是一個(gè)好主意,因?yàn)樵隗w系結(jié)構(gòu)上,它將對(duì)共享服務(wù)的訪問限制為業(yè)務(wù)層(而不是表示層)。 沒有單獨(dú)的層,在架構(gòu)上沒有限制表示層訪問這些公共服務(wù),使得難以管理該訪問限制[這句話沒看懂,回頭再看]。

在該示例中,新服務(wù)層可能駐留在業(yè)務(wù)層之下,同時(shí)表明該服務(wù)層中的組件不能被表示層訪問。 然而,這衍生出一個(gè)新的問題,業(yè)務(wù)層需要經(jīng)過服務(wù)層以到達(dá)持久層,但這根本沒有意義。 這是分層架構(gòu)的一個(gè)古老的問題,需要通過在架構(gòu)內(nèi)創(chuàng)建開放層來解決。

如圖1-3所示,在這種情況下,服務(wù)層被標(biāo)記為打開,意味著改層可以被繞過。 在以下示例中,由于服務(wù)層是打開的,因此業(yè)務(wù)層現(xiàn)在允許繞過它,并直接轉(zhuǎn)到持久層,這是完全合理的。

圖1-3 打開層和請(qǐng)求流

利用開放層和封閉層的概念有助于定義層次和請(qǐng)求流之間的關(guān)系,并且向設(shè)計(jì)者和開發(fā)者提供理解架構(gòu)內(nèi)的各種層訪問限制的必要信息。如果不能確定架構(gòu)中的哪些層是開放和封閉的(以及為什么)通常會(huì)導(dǎo)致架構(gòu)難以測(cè)試,維護(hù)和部署的緊密耦合和脆弱。

架構(gòu)例子(Pattern Example)

為了說明分層架構(gòu)的工作原理,考慮一個(gè)來自用戶檢索客戶信息的請(qǐng)求,如圖1-4所示。 黑色箭頭顯示請(qǐng)求流向數(shù)據(jù)庫以檢索客戶數(shù)據(jù),紅色箭頭顯示響應(yīng)返回到屏幕以顯示數(shù)據(jù)。 在該示例中,客戶信息包括客戶數(shù)據(jù)和訂單數(shù)據(jù)(由客戶下達(dá)的訂單)。

圖1-4 分層架構(gòu)例子

如圖所示,customer screen模塊負(fù)責(zé)接受用戶請(qǐng)求并顯示客戶信息,它不知道數(shù)據(jù)在哪里,如何檢索,也不了解數(shù)據(jù)庫,該模塊收到查詢客戶信息的請(qǐng)求后,將該請(qǐng)求轉(zhuǎn)發(fā)到customer delegate模塊,該模塊負(fù)責(zé)了解業(yè)務(wù)層中哪些模塊可以處理該請(qǐng)求,以及如何獲取該模塊需要的數(shù)據(jù)(例如合同數(shù)據(jù))。業(yè)務(wù)層中的custom object負(fù)責(zé)收集(aggregating)業(yè)務(wù)請(qǐng)求所需的所有信息(該例子中是指客戶信息)。該模塊調(diào)用customer dao(數(shù)據(jù)訪問對(duì)象)模塊在持久層中獲取客戶數(shù)據(jù),并且還通過order dao模塊獲取訂單信息。這些模塊又執(zhí)行SQL語句來檢索相應(yīng)的數(shù)據(jù),并將其傳回給業(yè)務(wù)層中的customer object模塊。一旦customer object接收到數(shù)據(jù),它整合數(shù)據(jù)并將該信息傳遞回customer delegate,然后將該數(shù)據(jù)傳遞到customer screen以呈現(xiàn)給用戶。

從技術(shù)的角度來看,這些模塊可以有很多實(shí)現(xiàn)方式。 例如,在Java平臺(tái)中,customer screen模塊可以是(JSF) Java Server Faces screen,它和customer delegage可以作為被管理的bean組件 。業(yè)務(wù)層中的customer object可以是本地Spring bean對(duì)象或遠(yuǎn)程EJB3 bean對(duì)象。 之前示例中的客戶和訂單數(shù)據(jù)可以由POJO,MyBatis XML Mapper,甚至可以是JDBC調(diào)用或Hibernate查詢返回的數(shù)據(jù)封裝。 在Microsoft平臺(tái)中,customer screen可以是基于.net技術(shù)體系A(chǔ)SP(活動(dòng)服務(wù)器頁面)模塊,客戶和訂單數(shù)據(jù)可以由為ADO(ActiveX數(shù)據(jù)對(duì)象)實(shí)現(xiàn)。

注意事項(xiàng)(Considerations)

分層架構(gòu)是比較實(shí)用并且通用的模式,對(duì)于多數(shù)程序是一個(gè)良好起點(diǎn),尤其是當(dāng)您不確定哪種架構(gòu)模式最適合您的應(yīng)用程序時(shí)。 當(dāng)選擇這種模式時(shí),你需要從架構(gòu)的角度來考慮一下幾點(diǎn)。

要注意的第一件事是所謂的污水池反模式(architecture
sinkhole anti-pattern)[誰能解釋一下這是啥意思]。 這個(gè)反模式是這樣的,請(qǐng)求流簡(jiǎn)單的穿過幾個(gè)層,每層里面基本沒有做任何業(yè)務(wù)邏輯,或者做了很少的業(yè)務(wù)邏輯。 例如,假設(shè)表示層響應(yīng)來自用戶的檢索客戶數(shù)據(jù)的請(qǐng)求。 表示層將請(qǐng)求傳遞給業(yè)務(wù)層,業(yè)務(wù)層簡(jiǎn)單地將請(qǐng)求傳遞給持久層,然后對(duì)數(shù)據(jù)庫層進(jìn)行簡(jiǎn)單的SQL調(diào)用以檢索客戶數(shù)據(jù)。 然后,數(shù)據(jù)一路返回,沒有用于聚集(aggregate),計(jì)算或變換數(shù)據(jù)的額外處理或邏輯。

每個(gè)分層架構(gòu)將具有至少一些落入反模式(architecture
sinkhole anti-pattern)的情況。 這里面的關(guān)鍵是分析出屬于此類別的請(qǐng)求的百分比。 80-20規(guī)則通常是一個(gè)良好的做法,以確定是否正在經(jīng)歷這種情況。通常將大約20%的請(qǐng)求作為簡(jiǎn)單傳遞處理,80%的請(qǐng)求具有與請(qǐng)求相關(guān)聯(lián)的某些業(yè)務(wù)邏輯。 但是,如果您發(fā)現(xiàn)此比例相反,并且大多數(shù)請(qǐng)求是簡(jiǎn)單的直通處理,您可能需要考慮使一些架構(gòu)層打開,需要注意的是這樣會(huì)讓層次的耦合度提高,使軟件變得不易改變。

分層體系結(jié)構(gòu)模式需要注意的另一個(gè)問題是,它會(huì)使得應(yīng)用程序變得monolithic[這個(gè)詞不知道怎么翻譯合適],即使你將表示層和業(yè)務(wù)層分成單獨(dú)的可部署單元。 雖然某些應(yīng)用程序不在乎這些問題[規(guī)模小的程序],但它的確會(huì)帶來部署,通用魯棒性和可靠性,性能和可擴(kuò)展性等方面的一些潛在問題。

模式分析(Pattern Analysis)

以下內(nèi)容包含分層架構(gòu)模式的常見架構(gòu)特性的評(píng)級(jí)和分析。每個(gè)特性的評(píng)級(jí)基于適用于該模式的普通場(chǎng)景。 對(duì)于此模式與本報(bào)告中其他模式如何相關(guān)的并行比較,請(qǐng)參見本報(bào)告末尾的附錄A.

靈活性(Overall agility)

  • 級(jí)別:低
  • 分析:靈活性是針對(duì)不斷變化的環(huán)境做出快速反應(yīng)的能力。 雖然可以通過該模式的層次隔離特點(diǎn)來應(yīng)對(duì)變化,但是由于monolithic性質(zhì)和這種模式帶來的組件間緊耦合的特性,在該體系結(jié)構(gòu)模式中進(jìn)行改變?nèi)匀皇欠爆嵑秃臅r(shí)的。

可部署性(Ease of deployment)

  • 級(jí)別:低
  • 分析:對(duì)于由該模式實(shí)現(xiàn)的大型應(yīng)用程序來講,部署可能會(huì)是一個(gè)問題 。對(duì)組件的一個(gè)小改變可能需要重新部署整個(gè)應(yīng)用程序(或應(yīng)用程序的大部分),導(dǎo)致需要加班進(jìn)行規(guī)劃,調(diào)度和執(zhí)行的部署。因此,此模式不適合進(jìn)行可持續(xù)部署,進(jìn)一步降低了部署的總體評(píng)級(jí)。

可測(cè)試性(Testability)

  • 級(jí)別:高
  • 分析:因?yàn)榻M件都隸屬于某層,而且其他層可以被插樁或者模擬,所以該模式相對(duì)容易測(cè)試。 開發(fā)人員可以通過模擬展示層中的組件中進(jìn)行業(yè)務(wù)層中組件的測(cè)試,或者模擬業(yè)務(wù)層以測(cè)試某些展示層組件的功能。

性能(Performance)

級(jí)別:低
分析:雖然一些分層架構(gòu)可以很好地執(zhí)行,但是由于必須經(jīng)歷架構(gòu)的多個(gè)層以滿足業(yè)務(wù)請(qǐng)求,效率較低,所以該模式不適用于高性能應(yīng)用。

可擴(kuò)展性(Scalability)

  • 級(jí)別:低
  • 分析:由于這種模式的緊密耦合和monolithic特點(diǎn),使用此架構(gòu)模式的應(yīng)用程序構(gòu)建通常難以擴(kuò)展。 您可以通過將層拆分為單獨(dú)的物理部署或?qū)⒄麄€(gè)應(yīng)用程序復(fù)制到多個(gè)節(jié)點(diǎn)來擴(kuò)展分層體系結(jié)構(gòu),但總體來說,粒度太分散,這使其擴(kuò)展成本昂貴。

開發(fā)容易度(Ease of development)

  • 級(jí)別:高
  • 分析:易于開發(fā)獲得相對(duì)高的分?jǐn)?shù),主要是因?yàn)檫@種模式是如此眾所周知的,并且實(shí)現(xiàn)起來不太復(fù)雜。 因?yàn)榇蠖鄶?shù)公司通過分層(界面,業(yè)務(wù),數(shù)據(jù)庫)分離技能集來開發(fā)應(yīng)用程序,所以這種模式成為大多數(shù)業(yè)務(wù)應(yīng)用程序開發(fā)的自然選擇。 公司的溝通和組織結(jié)構(gòu)之間的聯(lián)系以及開發(fā)軟件的方式被概述了所謂的 Conway’s law。

2.事件驅(qū)動(dòng)架構(gòu)(Event-Driven Architecture)

事件驅(qū)動(dòng)架構(gòu)模式是一個(gè)構(gòu)建高擴(kuò)展性程序的分布式異步架構(gòu)模式。 它還具有高度適應(yīng)性,可用于小型應(yīng)用和大型大型應(yīng)用或者是復(fù)雜的應(yīng)用。事件驅(qū)動(dòng)架構(gòu)由異步接收、處理事件的組件構(gòu)成,這些組件是高度解耦和職責(zé)單一的。

事件驅(qū)動(dòng)的架構(gòu)模式由兩種拓?fù)?topology)方式,即mediator和broker。當(dāng)你想要在事件內(nèi)編排一些步驟時(shí)需要mediator拓?fù)鋄wtf這句話],而當(dāng)您想要將事件鏈接在一起而不使用中央mediator時(shí),你需要broker拓?fù)?。因?yàn)檫@兩種拓?fù)浣Y(jié)構(gòu)的架構(gòu)特性和實(shí)現(xiàn)策略不同,所以了解每一種拓?fù)浣Y(jié)構(gòu)最適合您的特定情況是非常重要的。

Mediator拓?fù)?Mediator Topology)

Mediator拓?fù)溥m用于事件需要經(jīng)過多個(gè)步驟處理的情況。 例如,進(jìn)行股票交易的一個(gè)事件可能需要您首先驗(yàn)證交易,然后檢查該股票交易是否符合各種合規(guī)規(guī)則,將交易分配給經(jīng)紀(jì)人,計(jì)算傭金,最后完成交易。 所有這些步驟需要進(jìn)行精心的安排,從而可以順序的執(zhí)行.

在Mediator拓?fù)溆炙牟糠纸M成:事件隊(duì)列,事件mediator,事件通道和事件處理器.事件流從客戶端向事件隊(duì)列發(fā)送事件開始,事件隊(duì)列用于將事件傳輸?shù)绞录ediator.事件mediator接收事件后,通過向事件通道發(fā)送異步事件來執(zhí)行該事件的每個(gè)處理步驟.事件處理器監(jiān)聽事件通,并執(zhí)行特定的業(yè)務(wù)邏輯來處理事件。 圖2-1說明了事件驅(qū)動(dòng)架構(gòu)模式的Mediator拓?fù)?

圖2-1 中介拓?fù)?/div>

在事件驅(qū)動(dòng)架構(gòu)中,通常有十幾到幾百個(gè)事件隊(duì)列。 該模式不指定事件隊(duì)列組件的實(shí)現(xiàn); 它可以是消息隊(duì)列,web服務(wù)端點(diǎn)或者其他什么東西。

該模式中有兩種類型的事件:初始事件和處理事件.初始事件是由調(diào)解器接收的原始事件,而處理事件是由調(diào)解器生成并且由事件處理組件接收的事件。

事件mediator 組件負(fù)責(zé)協(xié)調(diào)初始事件中包含的步驟。 對(duì)于初始事件中的每一步,事件mediator將特定的處理事件發(fā)送到事件通道,然后由事件處理器接收并處理。 重要的是注意事件mediator實(shí)際上不執(zhí)行處理初始事件所必需的業(yè)務(wù)邏輯; 它只知道處理初始事件所需的步驟。

事件通道被事件mediator異步地將初始事傳遞給事件處理模塊. 事件通道可以是消息隊(duì)列或消息topics,盡管消息topics和mediator拓?fù)渫ǔ7旁谝黄鹗褂玫母嘁恍沟锰幚硎录梢杂啥鄠€(gè)事件處理器(每個(gè)事件處理器基于接收到的處理事件執(zhí)行不同的任務(wù))來處理[我感覺這里消息隊(duì)列和消息topics是兩個(gè)并列的概念,消息topics是指的是每個(gè)事件都能被處理模塊得到,有點(diǎn)像pub/sub,而消息隊(duì)列指的是每個(gè)事件只能又一個(gè)處理模塊得到,有點(diǎn)像pipeline]。

事件處理器組件包含處理處理事件所需的業(yè)務(wù)邏輯代碼。 事件處理器是在應(yīng)用或系統(tǒng)中執(zhí)行特定任務(wù)的自包含的(self-contained),獨(dú)立的,低耦合的架構(gòu)組件[就是指業(yè)務(wù)模塊]。盡管事件處理器組件的粒度可以從細(xì)粒度(例如,計(jì)算訂單上的銷售稅)到 粗粒度(例如,處理保險(xiǎn)索賠),重要的是每個(gè)事件處理器組件應(yīng)該執(zhí)行單個(gè)業(yè)務(wù)任務(wù),而不依賴于其他事件處理器完成其特定任務(wù)[業(yè)務(wù)模塊之間不應(yīng)該產(chǎn)生相互依賴]。

事件mediator可以以多種方式實(shí)現(xiàn). 作為架構(gòu)師,您應(yīng)該了解每個(gè)細(xì)節(jié),以確保該模式的解決方案符合您的需求。

事件mediator的最簡(jiǎn)單和最常見的實(shí)現(xiàn)是通過開源框架,例如Spring Integration,Apache CamelMule ESB.這些開源集成中心中的事件流通常通過Java代碼或DSL(領(lǐng)域?qū)S谜Z言)實(shí)現(xiàn)。 對(duì)于更復(fù)雜的中介和編排,您可以使用BPEL(domain-specific language)以及BPEL引擎(如開放源代碼Apache ODE)。 BPEL是一種標(biāo)準(zhǔn)的類似XML的語言,它描述了處理初始事件所需的數(shù)據(jù)和步驟。 對(duì)于需要更復(fù)雜的編排(包括涉及人員交互的步驟)的非常大的應(yīng)用程序,您可以使用業(yè)務(wù)流程管理器(BPM)(如jBPM)實(shí)現(xiàn)事件仲裁器。

理解您的需求并選擇合適的事件mediator實(shí)現(xiàn),對(duì)使用此拓?fù)涞娜魏问录?qū)動(dòng)成功至關(guān)重要。 使用開源集成中心來執(zhí)行非常復(fù)雜的業(yè)務(wù)流程管理編排是不正確的,就像實(shí)施一個(gè)BPM解決方案來執(zhí)行簡(jiǎn)單的路由邏輯一樣[宰牛不能用殺雞刀,殺雞不能用宰牛刀]。

為了說明mediator拓?fù)涫侨绾喂ぷ鞯?,假設(shè)你通過保險(xiǎn)公司投保,并決定修改。 在這種情況下,初始事件可能被稱為重定位事件(relocation
event)。 處理重定位事件涉及的步驟包含在事件mediator中,如圖2-2所示。 對(duì)于每個(gè)初始事件步驟,事件中介器創(chuàng)建處理事件(例如,改變地址,重新計(jì)算報(bào)價(jià)等),將該處理事件發(fā)送到事件信道,并等待由相應(yīng)的事件處理器處理的處理事件(例如 ,客戶過程,報(bào)價(jià)過程等)。 該過程繼續(xù),直到初始事件中的所有步驟都已被處理。 在Event Mediator中,Recalc Quate和Update Claims上面的箭頭代表這兩個(gè)步驟可同時(shí)進(jìn)行。


圖2-2 中介模式例子

Broker拓?fù)浼軜?gòu)[broker就是代理的意思]

Broker拓?fù)洳煌趍ediator拓?fù)?,因?yàn)闆]有中心事件mediator,消息通過輕量級(jí)消息代理(例如,ActiveMQ,HornetQ等)[Rabbitmq,zeromq]發(fā)布給業(yè)務(wù)組件。 當(dāng)您具有相對(duì)簡(jiǎn)單的事件處理流,并且您不需要中心mediator去安排更上層的業(yè)務(wù)流程,此拓?fù)浞浅S杏肹適合多數(shù)業(yè)務(wù)不太復(fù)雜的系統(tǒng)]。

該拓?fù)渲杏袃煞N主要類型的架構(gòu)組件:代理組件和事件處理器組件。 代理組件可以是一個(gè)或者好幾個(gè)(centralized or federated),并且包含了所有的事件通道,這些通道涵蓋在事件流內(nèi)。代理組件中包含的事件通道可以是消息隊(duì)列,消息主題發(fā)布或兩者的組合。

此拓?fù)淙鐖D2-3所示。 從圖中可以看出,沒有event-mediator組件來控制和編排初始事件; 相反,每個(gè)事件處理器組件負(fù)責(zé)處理事件并發(fā)布事件處理結(jié)果。 例如,平衡股票投資組合的事件處理器可以接收稱為股票分割的初始事件。 基于該初始事件,事件處理器可以進(jìn)行一些組合重新平衡,然后向代理發(fā)布稱為重新平衡組合的新事件,其然后將由不同的事件處理器拾取。 注意,可能存在事件由事件處理器發(fā)布但是沒有別的處理器接受的情況出現(xiàn)。這是常見的,尤其是當(dāng)您正在開發(fā)應(yīng)用程序或提供未來的功能和擴(kuò)展。


圖2-3 代理拓?fù)?/div>

為了說明代理拓?fù)淙绾喂ぷ?,我們將使用與mediator拓?fù)渲邢嗤氖纠?。由于沒有中央事件mediator來接收代理拓?fù)渲械某跏际录蛻暨^程組件直接接收事件,改變客戶地址,并且發(fā)出該地址改變事件。在此示例中,有兩個(gè)對(duì)更改地址事件感興趣的事件處理器:報(bào)價(jià)過程和聲明過程。報(bào)價(jià)處理器組件根據(jù)地址更改重新計(jì)算新的自動(dòng)保險(xiǎn)率,并向系統(tǒng)的其余部分發(fā)布事件指示它做的事情(例如,重新計(jì)算報(bào)價(jià)事件)。另一方面,聲明處理組件接收相同的改變地址事件,但是在這種情況下,它更新未完成的保險(xiǎn)聲明并且向系統(tǒng)發(fā)布事件作為更新聲明事件。這些新事件隨后被其他事件處理器組件拾取,并且事件鏈繼續(xù)通過系統(tǒng),直到不再有針對(duì)該特定啟動(dòng)事件發(fā)布的事件.[這不就是pr系統(tǒng)的設(shè)計(jì)嘛]


圖2-4 代理拓?fù)淅?/div>

從圖2-4中可以看出,代理拓?fù)浣Y(jié)構(gòu)都是關(guān)于執(zhí)行業(yè)務(wù)功能的事件總線。 理解代理拓?fù)涞淖詈梅椒ㄊ菍⑵湟暈橹欣^競(jìng)賽。在接力賽中,跑步者持有接力棒并運(yùn)行一定距離,然后將指揮棒交給下一個(gè)跑步者,依此類推 直到最后一個(gè)運(yùn)動(dòng)員穿過終點(diǎn)線。 在接力賽中,一旦運(yùn)動(dòng)員交出指揮棒,她就完成了比賽。 這對(duì)于代理拓?fù)湟彩侨绱耍阂坏┦录幚砥髑袚Q事件,它不再參與該特定事件的處理。

注意事項(xiàng)(Considerations)

事件驅(qū)動(dòng)的架構(gòu)模式是一個(gè)相對(duì)復(fù)雜的模式實(shí)現(xiàn),主要是由于它的異步的特點(diǎn)。當(dāng)實(shí)現(xiàn)這種模式時(shí),您必須解決各種分布式架構(gòu)問題,如遠(yuǎn)程進(jìn)程可用性,缺乏響應(yīng)性和代理重新連接邏輯 事件代理或mediator失敗。

這種架構(gòu)模式適用于缺少原子性事務(wù)的業(yè)務(wù)流程。 因?yàn)槭录幚砥鹘M件是高度去耦合和分布式的,所以很難跨越多個(gè)業(yè)務(wù)組件的同時(shí)去維護(hù)業(yè)務(wù)的事務(wù)特點(diǎn)[ACID]。 因此,在使用此模式設(shè)計(jì)應(yīng)用程序時(shí),必須不斷考慮哪些事件可以獨(dú)立運(yùn)行或者不單獨(dú)運(yùn)行,并相應(yīng)地計(jì)劃事件處理器的粒度。 如果您發(fā)現(xiàn)由多個(gè)事件處理器構(gòu)成一個(gè)工作單元,換句話說,如果您使用分散的處理器來處理不可分割的事務(wù),在這種情況下,該模式可能不適合您的應(yīng)用程序。

事件驅(qū)動(dòng)的架構(gòu)模式的最困難的方面之一可能是事件處理器組件之間契約(contracts)的創(chuàng)建,維護(hù)和管理。 每個(gè)事件通常具有與它相關(guān)聯(lián)的契約形式(例如,數(shù)據(jù)值和數(shù)據(jù)格式).使用此模式來建立標(biāo)準(zhǔn)數(shù)據(jù)格式(例如,XML,JSON,Java對(duì)象等)并從一開始就建立契約的版本控制策略至關(guān)重要[業(yè)務(wù)模塊之間的接口很重要,也非常容易發(fā)生變化!!!]。

模式分析(Pattern Analysis)

該章節(jié)包含事件驅(qū)動(dòng)架構(gòu)模式的常見架構(gòu)特性的評(píng)級(jí)和分析。 每個(gè)特性的評(píng)級(jí)基于自然趨勢(shì)或該特性作為基于圖案的典型實(shí)施的能力,以及通常已知的圖案。 對(duì)于此模式與本報(bào)告中其他模式如何相關(guān)的并行比較,請(qǐng)參見本報(bào)告末尾的附錄A.

靈活性(Overall agility)

  • 級(jí)別:高
  • 分析:靈活性是指軟件應(yīng)對(duì)變化的能力。 由于事件處理器組件是職責(zé)單一的的并且與其他事件處理器組件完全解耦,因此改變通常被隔離到一個(gè)或幾個(gè)事件處理器內(nèi),并且可以快速地做出改變而不影響其他組件.

易部署性(Ease of deployment)

  • 級(jí)別:高
  • 分析:總得來說,由于事件處理器組件的去耦特性,這種模式相對(duì)容易部署。 代理拓?fù)溱呄蛴诒戎薪槠魍負(fù)涓子诓渴穑饕且驗(yàn)槭录薪槠鹘M件和事件處理組件是緊耦合的:事件處理器組件中的更改也可能需要事件介體進(jìn)行更改,兩者都要進(jìn)行重新部署.

可測(cè)試性(Testability)

  • 級(jí)別:低
  • 分析:雖然單個(gè)單元測(cè)試不是特別困難,但它需要某種專門的測(cè)試客戶端或測(cè)試工具來生成事件。 這種模式的異步性質(zhì)也使測(cè)試復(fù)雜化。

性能(Performance)

  • 級(jí)別:高
  • 分析:雖然該架構(gòu)的效率很大程度上取決于消息發(fā)送基礎(chǔ)結(jié)構(gòu),但是通常來說,該模式通過其異步能力實(shí)現(xiàn)高性能; 換句話說,執(zhí)行解耦,并行異步操作的能力勝過入隊(duì)和出隊(duì)消息的成本。

可擴(kuò)展性(Scalability)

  • 級(jí)別:高
  • 分析:由于擁有獨(dú)立和低耦合的事件處理器,該架構(gòu)天生的具有高可擴(kuò)展性。 每個(gè)事件處理器可以單獨(dú)縮放,允許細(xì)粒度可伸縮性。

開發(fā)容易度(Ease of development)

  • 級(jí)別:低
  • 分析:由于該模式異步的特性,需要建立契約,以及需要考慮針對(duì)代理錯(cuò)誤以及異常事件的處理,該架構(gòu)不同意上手.

3.微內(nèi)核架構(gòu) (Microkernel Architecture)

微內(nèi)核架構(gòu)模式(有時(shí)稱為插件架構(gòu)模式)是實(shí)現(xiàn)基于產(chǎn)品的應(yīng)用程序所使用的模式。 基于產(chǎn)品的應(yīng)用程序是作為典型的第三方產(chǎn)品被打包并提供下載的應(yīng)用程序。 然而,許多公司也開發(fā)和發(fā)布其內(nèi)部業(yè)務(wù)應(yīng)用程序,如軟件產(chǎn)品,完整版本,發(fā)行說明和可插拔功能。 這些也是這種模式的典型應(yīng)用。 微內(nèi)核架構(gòu)模式允許您將附加應(yīng)用程序功能作為插件添加到核心應(yīng)用程序,提供可擴(kuò)展性以及功能分離和隔離。

架構(gòu)描述

微內(nèi)核架構(gòu)模式由兩種類型的架構(gòu)組件組成:核心系統(tǒng)和插件模塊。業(yè)務(wù)邏輯分開在獨(dú)立插件模塊和基本核心系統(tǒng)之間,這種方式提供功能和業(yè)務(wù)邏輯的可擴(kuò)展性,靈活性和隔離的特點(diǎn)。 圖3-1說明了基本微內(nèi)核架構(gòu)模式.

圖3-1 微核架構(gòu)設(shè)計(jì)

微內(nèi)核架構(gòu)模式的核心系統(tǒng)僅包含使系統(tǒng)運(yùn)行所需的最小功能集.許多操作系統(tǒng)實(shí)現(xiàn)了微內(nèi)核架構(gòu)模式,因此是該模式名稱的起源。從業(yè)務(wù)程序的角度來看,核心系統(tǒng)通常被定義為通用業(yè)務(wù)邏輯,不包含針對(duì)特殊情況或者復(fù)雜情況的自定義代碼.

插件模塊是獨(dú)立的獨(dú)立組件,包含特殊的處理,附加的功能和自定義代碼,用于增強(qiáng)或擴(kuò)展核心系統(tǒng)以產(chǎn)生額外的業(yè)務(wù)功能。 通常,插件模塊應(yīng)該獨(dú)立于其他插件模塊,但是您當(dāng)然可以設(shè)計(jì)需要其他插件的插件。 無論哪種方式,重要的是保持插件之間的通信最小化,以避免依賴性問題。

核心系統(tǒng)需要知道哪些插件模塊可用以及如何獲取它們。 一種常見的實(shí)現(xiàn)方式是通過某種插件注冊(cè)表。 此注冊(cè)表包含有關(guān)每個(gè)插件模塊的信息,包括其名稱,數(shù)據(jù)結(jié)構(gòu)和遠(yuǎn)程訪問協(xié)議詳細(xì)信息(取決于插件如何連接到核心系統(tǒng)). 例如,用于標(biāo)記高風(fēng)險(xiǎn)稅務(wù)審計(jì)項(xiàng)目的稅務(wù)軟件的插件可能具有包含服務(wù)名稱(AuditChecker),數(shù)據(jù)結(jié)構(gòu)(輸入數(shù)據(jù)和輸出數(shù)據(jù))和合同格式的注冊(cè)表項(xiàng) (XML).如果插件通過SOAP訪問,它還可能包含WSDL(Web服務(wù)定義語言).

插件模塊可以通過各種方式連接到核心系統(tǒng),包括OSGi(開放服務(wù)網(wǎng)關(guān)倡議),消息,web服務(wù)或甚至直接點(diǎn)對(duì)點(diǎn)綁定(即對(duì)象實(shí)例化)。 您使用的連接類型取決于您正在構(gòu)建的應(yīng)用程序類型(小型產(chǎn)品或大型業(yè)務(wù)應(yīng)用程序)和您的特定需求(例如,單一部署或分布式部署)。 架構(gòu)模式本身不指定任何這些實(shí)現(xiàn)細(xì)節(jié),只有插件模塊必須保持彼此獨(dú)立。

插件模塊可以通過各種方式連接到核心系統(tǒng),包括OSGi(開放服務(wù)網(wǎng)關(guān)倡議),消息,web服務(wù)或甚至直接點(diǎn)對(duì)點(diǎn)綁定(即對(duì)象實(shí)例化). 您使用的連接類型取決于您正在構(gòu)建的應(yīng)用程序類型(小型產(chǎn)品或大型業(yè)務(wù)應(yīng)用程序)和您的特定需求(例如,單一部署或分布式部署).架構(gòu)模式本身不指定任何這些實(shí)現(xiàn)細(xì)節(jié),只有插件模塊必須保持彼此獨(dú)立。

插件模塊和核心系統(tǒng)之間的契約范圍可以從標(biāo)準(zhǔn)契約到自定義契約. 自定義契約通常在插件組件由第三方開發(fā)的情況下建立,其中您無法控制插件使用的契約。 在這種情況下,在插件契約和標(biāo)準(zhǔn)契約之間插入一個(gè)適配器,以便核心系統(tǒng)不需要每個(gè)插件都有專門的代碼。 在創(chuàng)建標(biāo)準(zhǔn)契約(通常通過XML或Java Map實(shí)現(xiàn))時(shí),務(wù)必記住從開始就創(chuàng)建版本控制策略。

模式例子(Pattern Examples)

內(nèi)核架構(gòu)的最好的例子是Eclipse IDE.下載基本的Eclipse產(chǎn)品只是一個(gè)漂亮的編輯器。 然而,一旦你開始添加插件,它就成為一個(gè)高度可定制和有用的產(chǎn)品?;ヂ?lián)網(wǎng)瀏覽器是另一個(gè)常見的產(chǎn)品示例使用微內(nèi)核架構(gòu):查看器和其他插件添加額外的功能,在基本的瀏覽器 即核心系統(tǒng))。

類似這種基于產(chǎn)品軟件的例子是挺多的,但是大型企業(yè)應(yīng)用程序呢? 微內(nèi)核架構(gòu)也適用于這些情況。 為了說明這一點(diǎn),讓我們使用另一個(gè)保險(xiǎn)公司的例子,但這次涉及保險(xiǎn)索賠處理。

索賠處理是一個(gè)非常復(fù)雜的過程。 每個(gè)地區(qū)對(duì)保險(xiǎn)索賠中的內(nèi)容都有不同的規(guī)則和的規(guī)定。 例如,當(dāng)您的擋風(fēng)玻璃被巖石損壞,一些地區(qū)允許更換擋風(fēng)玻璃,而其他地區(qū)則不會(huì)。 這為標(biāo)準(zhǔn)索賠創(chuàng)建了一個(gè)很大的條件集合。

毫不奇怪,大多數(shù)保險(xiǎn)索賠應(yīng)用程序利用大型和復(fù)雜的規(guī)則引擎來處理這種復(fù)雜性。 然而,這些規(guī)則引擎可以成長(zhǎng)為一個(gè)復(fù)雜的大泥球,其中改變一個(gè)規(guī)則影響其它規(guī)則,或者做一個(gè)簡(jiǎn)單的規(guī)則改變就需要一支分析師,開發(fā)人員和測(cè)試人員的隊(duì)伍。 使用微內(nèi)核架構(gòu)模式可以解決許多這些問題。

圖3-2中顯示的文件夾堆棧表示聲明處理的核心系統(tǒng)。 它包含保險(xiǎn)公司處理索賠所需的基本業(yè)務(wù)邏輯,不包含任何定制處理。 每個(gè)插件模塊包含該地區(qū)的特定規(guī)則。 在該示例中,可以使用定制源代碼或單獨(dú)的規(guī)則引擎實(shí)例來實(shí)現(xiàn)插件模塊。 不管實(shí)現(xiàn)如何,關(guān)鍵點(diǎn)是地區(qū)特定的規(guī)則和處理與核心聲明系統(tǒng)分離,并且可以進(jìn)行添加,刪除和修改,并且對(duì)核心系統(tǒng)或其他插件模塊幾乎沒有影響.


圖3-2 微核架構(gòu)例子

結(jié)論(Considerations)

微內(nèi)核架構(gòu)模式的一個(gè)好處是它可以嵌入或用作另一個(gè)架構(gòu)模式的一部分。例如,如果此模式解決了應(yīng)用程序的特定易失性區(qū)域中存在的特定問題,您可能會(huì)發(fā)現(xiàn)不能使用這種模式實(shí)現(xiàn)整個(gè)架構(gòu)。 在這種情況下,您可以將微服務(wù)架構(gòu)模式嵌入您正在使用的另一個(gè)模式(例如,分層架構(gòu)).類似地,可以使用微服務(wù)架構(gòu)模式來實(shí)現(xiàn)在先前關(guān)于事件驅(qū)動(dòng)架構(gòu)的部分中描述的事件處理器組件.

微服務(wù)架構(gòu)模式為進(jìn)化設(shè)計(jì)和增量開發(fā)提供了極大的支持.您可以首先生成一個(gè)堅(jiān)實(shí)的核心系統(tǒng),隨著應(yīng)用程序的不斷發(fā)展,添加功能和功能,而不必對(duì)核心系統(tǒng)進(jìn)行重大更改。

對(duì)于基于產(chǎn)品的應(yīng)用程序,微內(nèi)核架構(gòu)模式應(yīng)始終是您的首選架構(gòu),特別是對(duì)于那些將隨著時(shí)間的推移發(fā)布其他功能,并希望控制不同用戶獲得不同的功能。 如果您發(fā)現(xiàn)該模式不能滿足您的所有需求,您可以隨時(shí)將您的應(yīng)用程序重構(gòu)為更適合您的特定需求的另一個(gè)架構(gòu)模式。

模式分析(Pattern Analysis)

該章節(jié)包含事件驅(qū)動(dòng)架構(gòu)模式的常見架構(gòu)特性的評(píng)級(jí)和分析。 每個(gè)特性的評(píng)級(jí)基于自然趨勢(shì)或該特性作為基于圖案的典型實(shí)施的能力,以及通常已知的圖案。 對(duì)于此模式與本報(bào)告中其他模式如何相關(guān)的并行比較,請(qǐng)參見本報(bào)告末尾的附錄A.

靈活性(Overall agility)

  • 級(jí)別:高
  • 分析:總體靈活性是對(duì)不斷變化的環(huán)境做出快速反應(yīng)的能力.通過松散耦合的插件模塊.可以在很大程度上隔離和實(shí)現(xiàn)更改。 一般來說,大多數(shù)微內(nèi)核架構(gòu)的核心系統(tǒng)趨于快速穩(wěn)定,因此相當(dāng)穩(wěn)健,并且很少需要隨時(shí)間變化。

可部署性(Ease of deployment)

  • 級(jí)別:高
  • 分析:根據(jù)如何實(shí)現(xiàn)模式,插件模塊可以在運(yùn)行時(shí)動(dòng)態(tài)地添加到核心系統(tǒng)(例如,熱部署),從而最小化部署期間的停機(jī)時(shí)間。

可測(cè)試性(Testability)

  • 級(jí)別:高
  • 分析:插件模塊可以進(jìn)行隔離測(cè)試,并且可以很容易地被核心系統(tǒng)模仿以論證或原型化特定特征,而對(duì)核心系統(tǒng)的改變很少或沒有改變。

性能(Performance)

  • 級(jí)別:高
  • 分析:雖然微內(nèi)核模式不適合高性能應(yīng)用程序,但一般來說,使用微內(nèi)核架構(gòu)模式構(gòu)建的大多數(shù)應(yīng)用程序性能良好,因?yàn)槟梢宰远x和簡(jiǎn)化應(yīng)用程序,僅包含您需要的功能. JBoss應(yīng)用服務(wù)器就是一個(gè)很好的例子:使用它的插件架構(gòu),你可以將應(yīng)用服務(wù)器修剪到你需要的那些特性,消除昂貴的未使用的功能,例如遠(yuǎn)程訪問,消息傳遞和消耗內(nèi)存的緩存 ,CPU和線程等并減慢應(yīng)用程序服務(wù)器.

可擴(kuò)展性(Scalability)

  • 級(jí)別:低
  • 分析:因?yàn)榇蠖鄶?shù)微內(nèi)核架構(gòu)實(shí)現(xiàn)是基于產(chǎn)品的,并且通常規(guī)模較小,所以它們被實(shí)現(xiàn)為單個(gè)單元,因此不是高度可擴(kuò)展的。根據(jù)如何實(shí)現(xiàn)插件模塊,有時(shí)可以在插件功能級(jí)別提供可擴(kuò)展性 ,但總的來說,這種模式對(duì)于生產(chǎn)高度可擴(kuò)展的應(yīng)用程序比較少。

開發(fā)容易度(Ease of development)

  • 級(jí)別:低
  • 分析:微內(nèi)核架構(gòu)需要周密的設(shè)計(jì)和合同管理,使其實(shí)現(xiàn)起來相當(dāng)復(fù)雜.契約版本控制,內(nèi)部插件注冊(cè)表,插件粒度以及可用于插件連接的廣泛選擇都有助于實(shí)現(xiàn)此模式所涉及的復(fù)雜性。

4.微服務(wù)架構(gòu)(Microservices Architecture Pattern)

微服務(wù)架構(gòu)模式作為單體應(yīng)用程序和面向服務(wù)的架構(gòu)的可行替代方案,正在業(yè)界迅速獲得成功。 因?yàn)檫@種架構(gòu)模式一直在發(fā)展,所以業(yè)界對(duì)這個(gè)模式是什么以及如何實(shí)現(xiàn)有很多困惑.本章節(jié)將向您提供了解這種重要架構(gòu)模式的優(yōu)點(diǎn)(和權(quán)衡)所必需的關(guān)鍵概念和基礎(chǔ)知識(shí),以及它是否適合您的應(yīng)用程序。

無論您選擇的拓?fù)浣Y(jié)構(gòu)或?qū)崿F(xiàn)風(fēng)格如何,都有一些常見的核心概念適用于一般的架構(gòu)模式。 首先是單獨(dú)部署單元的概念。 如圖4-1所示,微服務(wù)架構(gòu)的每個(gè)組件都作為一個(gè)單獨(dú)的單元部署,允許通過有效和簡(jiǎn)化的交付管道更容易地部署,提高可擴(kuò)展性,以及在應(yīng)用程序中實(shí)現(xiàn)高度的應(yīng)用程序和組件解耦。

從單體應(yīng)用到微服務(wù)架構(gòu)風(fēng)格的演進(jìn)路徑主要是通過開發(fā)持續(xù)交付,從開發(fā)到生產(chǎn)的連續(xù)部署的概念,這簡(jiǎn)化了應(yīng)用程序的部署.單體應(yīng)用通常由多個(gè)緊密耦合的組件構(gòu)成,這些組件是部署單元的一部分,這使得改變,測(cè)試和部署應(yīng)用變得麻煩和困難(因此,大多數(shù)大型IT商店中常見的“每月部署”周期的興起 ). 這些因素通常導(dǎo)致脆弱的應(yīng)用程序,每次部署新的東西時(shí)容易被破壞.微服務(wù)架構(gòu)模式通過將應(yīng)用程序分為多個(gè)可部署單元(服務(wù)組件)來解決這些問題,這些可單獨(dú)開發(fā),測(cè)試和部署,而與其他服務(wù)組件無關(guān)。

圖4-1 基本微服務(wù)架構(gòu)

理解這個(gè)模式最重要的概念是服務(wù)組件的概念。 相比考慮微服務(wù)架構(gòu)中的服務(wù),最好還是考慮服務(wù)組件,服務(wù)組件從單個(gè)模塊到大塊應(yīng)用的粒度可能有所不同。 服務(wù)組件包含表示單一用途功能(例如,為特定城市或城鎮(zhèn)提供天氣)或大型商業(yè)應(yīng)用的獨(dú)立部分(例如,股票交易放置或 確定汽車保險(xiǎn)費(fèi)率)。 設(shè)計(jì)正確級(jí)別的服務(wù)組件粒度是微服務(wù)架構(gòu)中最大的挑戰(zhàn)之一。 此挑戰(zhàn)在以下服務(wù)組件編排子部分中有更詳細(xì)的討論。

微服務(wù)架構(gòu)模式內(nèi)的另一個(gè)關(guān)鍵概念是其是分布式架構(gòu),意味著架構(gòu)內(nèi)的所有組件彼此完全解耦并且通過某種遠(yuǎn)程訪問協(xié)議(例如JMS,AMQP,REST,SOAP, RMI等)。 這種架構(gòu)模式的分布式特性有助于實(shí)現(xiàn)其一些卓越的可擴(kuò)展性和部署特性。

微服務(wù)架構(gòu)的一個(gè)吸引人的地方在于它是從與其他通用架構(gòu)模式相關(guān)的問題演變而成,而不是作為等待問題發(fā)生的解決方案來創(chuàng)建.微服務(wù)架構(gòu)風(fēng)格自然地從兩個(gè)主要來源演變而來:使用分層架構(gòu)模式開發(fā)的單體應(yīng)用程序和通過面向服務(wù)的架構(gòu)模式開發(fā)的分布式應(yīng)用程序.

從單體應(yīng)用到微服務(wù)架構(gòu)風(fēng)格的演進(jìn)路徑主要是通過開發(fā)持續(xù)交付,從開發(fā)到生產(chǎn)的連續(xù)部署管道的概念,這簡(jiǎn)化了應(yīng)用程序的部署。 單片應(yīng)用通常包含緊密耦合的組件,使得改變包含改變,測(cè)試和部署應(yīng)用變得麻煩和困難(因此,大多數(shù)大型IT商店中常見的“每月部署”周期的興起 )。 這些因素通常導(dǎo)致脆弱的應(yīng)用程序,每次部署新的東西時(shí)都會(huì)產(chǎn)生風(fēng)險(xiǎn)。 微服務(wù)架構(gòu)模式通過將應(yīng)用程序分為多個(gè)可部署單元(服務(wù)組件)來解決這些問題,這些可單獨(dú)開發(fā),測(cè)試和部署,而與其他服務(wù)組件無關(guān)。

導(dǎo)致微服務(wù)體系結(jié)構(gòu)模式的另一個(gè)來源是來自實(shí)現(xiàn)面向服務(wù)的體系結(jié)構(gòu)模式(SOA)的應(yīng)用程序出現(xiàn)的問題.雖然SOA模式非常強(qiáng)大,提供了強(qiáng)大的抽象級(jí)別,異構(gòu)連接,服務(wù)編排,以及將業(yè)務(wù)目標(biāo)與IT功能對(duì)齊的承諾,但是它是復(fù)雜,昂貴,分散的,難以理解和實(shí)施的,而且對(duì)于大多數(shù)應(yīng)用是過度的. 微服務(wù)架構(gòu)風(fēng)格通過簡(jiǎn)化服務(wù)概念,消除編排需求以及簡(jiǎn)化連接和訪問服務(wù)組件來解決這種復(fù)雜性。

模式拓?fù)?Pattern Topologies)

雖然有幾十種方法來實(shí)現(xiàn)微服務(wù)架構(gòu)模式,但其中三個(gè)主要拓?fù)浣Y(jié)構(gòu)是最常見和最受歡迎的:基于API REST的拓?fù)?API REST-based),基于應(yīng)用程序REST的拓?fù)?API REST-based)和集中式消息傳遞拓?fù)?centralized messaging)。

基于API REST的拓?fù)渫ㄟ^一些API(應(yīng)用程序編程接口)暴露的較少,獨(dú)立的單獨(dú)服務(wù),這對(duì)于一些網(wǎng)站是有用的。 此拓?fù)洌ㄈ鐖D4-2所示)由非常細(xì)粒度的服務(wù)組件(因此稱為微服務(wù))組成,其中包含一個(gè)或兩個(gè)模塊,這些模塊獨(dú)立于其他服務(wù)執(zhí)行特定的業(yè)務(wù)功能。 在這種拓?fù)渲?,這些細(xì)粒度的服務(wù)組件通常使用通過單獨(dú)部署的基于web的API層實(shí)現(xiàn)的基于REST的接口來訪問。該拓?fù)涞氖纠ㄓ蒠ahoo,Google和Amazon建立的單一職責(zé)的RESTful web服務(wù).

圖4-2 API REST結(jié)構(gòu)

應(yīng)用程序基于REST的拓?fù)渑c基于API REST的方法不同的,它是通過傳統(tǒng)的基于Web或胖客戶端的業(yè)務(wù)應(yīng)用程序界面接收客戶端請(qǐng)求,而不是通過簡(jiǎn)單的API層. 如圖4-3所示,應(yīng)用程序的用戶界面層被部署為單獨(dú)的Web應(yīng)用程序,通過簡(jiǎn)單的基于REST的接口遠(yuǎn)程訪問單獨(dú)部署的服務(wù)組件(業(yè)務(wù)功能)。 此拓?fù)渲械姆?wù)組件與基于API-REST的拓?fù)渲械姆?wù)組件不同,這些服務(wù)組件往往更大,更粗略,并且代表整體業(yè)務(wù)應(yīng)用程序的一小部分,而不是細(xì)粒度的單一服務(wù) 。 這種拓?fù)鋵?duì)于具有相對(duì)較低復(fù)雜度的小到中等規(guī)模的業(yè)務(wù)應(yīng)用是常見的。

圖4-3 Application REST拓?fù)?/div>

微服務(wù)架構(gòu)模式中的另一種常見方法是集中式消息傳遞拓?fù)洹?此拓?fù)洌ㄈ鐖D4-4所示)類似于之前基于REST的應(yīng)用程序拓?fù)?,除了不使用REST進(jìn)行遠(yuǎn)程訪問,此拓?fù)涫褂幂p量級(jí)集中式消息代理(例如ActiveMQ,HornetQ等).當(dāng)查看此拓?fù)鋾r(shí),不要將其與面向服務(wù)的架構(gòu)模式混淆或?qū)⑵湟暈椤癝OA-Lite”,這是至關(guān)重要的.在此拓?fù)渲姓业降妮p量級(jí)消息代理不會(huì)執(zhí)行任何編排,轉(zhuǎn)換或復(fù)雜路由,它只是一個(gè)輕量級(jí)的傳輸來訪問遠(yuǎn)程服務(wù)組件.

圖4-4 集中消息拓?fù)?/div>

集中式消息拓?fù)溥m用于在需要對(duì)用戶接口和服務(wù)組件之間的傳輸層進(jìn)行更復(fù)雜控制的更大的業(yè)務(wù)應(yīng)用或應(yīng)用.與先前討論的簡(jiǎn)單的基于REST的拓?fù)湎啾龋送負(fù)涞膬?yōu)點(diǎn)是高級(jí)排隊(duì)機(jī)制,異步消息傳遞,監(jiān)視,錯(cuò)誤處理以及更好的總體負(fù)載平衡和可擴(kuò)展性。 通常通過代理群集和代理聯(lián)合(將單個(gè)代理實(shí)例分成多個(gè)代理實(shí)例,以根據(jù)系統(tǒng)的功能區(qū)域劃分消息吞吐量負(fù)載)來解決通常與集中式代理相關(guān)聯(lián)的單點(diǎn)故障和架構(gòu)瓶頸問題。

避免依賴和編排(Avoid Dependencies and Orchestration)

微服務(wù)架構(gòu)模式的主要挑戰(zhàn)之一是為服務(wù)組件確定正確的粒度級(jí)別。 如果服務(wù)組件過粗,您可能無法實(shí)現(xiàn)這種架構(gòu)模式(部署,可擴(kuò)展性,可測(cè)試性和松耦合)帶來的好處。 然而,過于細(xì)粒度的服務(wù)組件將導(dǎo)致服務(wù)編排的需求,這會(huì)將精簡(jiǎn)的微服務(wù)架構(gòu)轉(zhuǎn)變?yōu)橹亓考?jí)的面向服務(wù)的架構(gòu),并且會(huì)包含在SOA所特有的復(fù)雜性,混亂,昂貴和瑕疵.

如果您發(fā)現(xiàn)需要從應(yīng)用程序的用戶界面層或API層中編排您的服務(wù)組件,那么您的服務(wù)組件可能太細(xì)粒度。 同樣,如果您發(fā)現(xiàn)需要在服務(wù)組件之間執(zhí)行服務(wù)間通信來處理單個(gè)請(qǐng)求,則您的服務(wù)組件可能過于細(xì)粒度,或者從業(yè)務(wù)功能的角度來看,它們沒有正確分區(qū).

可以通過共享數(shù)據(jù)庫來處理可能強(qiáng)制組件之間不期望的耦合的服務(wù)間通信。 例如,如果處理因特網(wǎng)訂單的服務(wù)組件需要客戶信息,則它可以去到數(shù)據(jù)庫以檢索必要的數(shù)據(jù),而不是調(diào)用客戶 - 服務(wù)組件內(nèi)的功能。

共享數(shù)據(jù)庫可以提供所需的信息,但是共享功能怎么辦? 如果服務(wù)組件需要包含在另一個(gè)服務(wù)組件中或所有服務(wù)組件都共用的功能,您有時(shí)可以跨服務(wù)組件復(fù)制共享功能(從而違反DRY原則:不要重復(fù)自己).在大多數(shù)實(shí)現(xiàn)微服務(wù)架構(gòu)模式的業(yè)務(wù)應(yīng)用程序中,這是相當(dāng)常見的做法,為了保持服務(wù)組件獨(dú)立和分離其部署,需要將業(yè)務(wù)邏輯小部分的冗余.小型實(shí)用程序類可能屬于此類重復(fù)的代碼。

如果您發(fā)現(xiàn)無論服務(wù)組件粒度級(jí)別如何,您仍然無法避免服務(wù)組件編排,那么這是一個(gè)好的跡象,這可能不是您的應(yīng)用程序的正確的架構(gòu)模式.由于此模式的分布式特性,很難在服務(wù)組件之間(和之間)維護(hù)單個(gè)事務(wù)性工作單元. 這種做法將需要某種用于回滾事務(wù)的事務(wù)補(bǔ)償框架,這為這種相對(duì)簡(jiǎn)單和優(yōu)雅的架構(gòu)模式增加了顯著的復(fù)雜性[事物不能跨組件來完成]。

注意事項(xiàng)(Considerations)

微服務(wù)架構(gòu)模式解決了在單片應(yīng)用程序以及面向服務(wù)的架構(gòu)中發(fā)現(xiàn)的許多常見問題.由于主要應(yīng)用程序組件被拆分成更小的,單獨(dú)部署的單元,使用微服務(wù)架構(gòu)模式構(gòu)建的應(yīng)用程序通常更健壯,提供更好的可擴(kuò)展性,并且可以更容易地支持連續(xù)傳遞。

這種模式的另一個(gè)優(yōu)點(diǎn)是它提供了進(jìn)行實(shí)時(shí)生產(chǎn)部署的能力,從而顯著減少對(duì)傳統(tǒng)的每月或周末“大爆炸”生產(chǎn)部署的需求。 由于更改通常與特定服務(wù)組件隔離,因此只需要部署需要更改的服務(wù)組件。 如果您只有一個(gè)服務(wù)組件的一個(gè)實(shí)例,您可以在用戶界面應(yīng)用程序中編寫專門的代碼來檢測(cè)活動(dòng)的熱部署,并將用戶重定向到錯(cuò)誤頁面或等待頁面。 或者,您可以在實(shí)時(shí)部署期間交換服務(wù)組件的多個(gè)實(shí)例,從而在部署周期內(nèi)實(shí)現(xiàn)連續(xù)可用性(這對(duì)于分層架構(gòu)模式非常困難)。

要考慮的最后一個(gè)考慮因素是,由于微服務(wù)架構(gòu)模式是分布式架構(gòu),它分享了在事件驅(qū)動(dòng)架構(gòu)模式中發(fā)現(xiàn)的一些相同的復(fù)雜問題,包括契約創(chuàng)建,維護(hù)和治理,遠(yuǎn)程系統(tǒng)可用性, 遠(yuǎn)程訪問認(rèn)證和授權(quán)。

模式分析(Pattern Analysis)

該章節(jié)包含常見架構(gòu)特性的評(píng)級(jí)和分析。 每個(gè)特性的評(píng)級(jí)基于自然趨勢(shì)或該特性作為基于圖案的典型實(shí)施的能力,以及通常已知的圖案。 對(duì)于此模式與本報(bào)告中其他模式如何相關(guān)的并行比較,請(qǐng)參見本報(bào)告末尾的附錄A.

靈活性(Overall agility)

  • 級(jí)別:高
  • 分析:總體靈活性是對(duì)不斷變化的環(huán)境做出快速反應(yīng)的能力.由于單獨(dú)部署的單元這個(gè)特點(diǎn),改變通常被隔離到單獨(dú)的服務(wù)組件,這允許快速和容易的部署。此外,使用這種模式的應(yīng)用建立趨于非常松散耦合,這也有助于促進(jìn)改變。

可部署性(Ease of deployment)

  • 級(jí)別:高
  • 分析:總體上,由于事件處理器組件的去耦特性,這種模式相對(duì)容易部署.代理拓?fù)溱呄蛴诒戎薪槠魍負(fù)涓菀撞渴?主要是因?yàn)槭录薪槠鹘M件在某種程度上緊密耦合到事件處理器:事件處理器組件的變化也可能需要事件中介器的改變, 被部署為任何給定的變化。

可測(cè)試性(Testability)

  • 級(jí)別:高
  • 分析:由于將業(yè)務(wù)功能分離和隔離為獨(dú)立應(yīng)用程序,因此可以對(duì)測(cè)試進(jìn)行限定,從而實(shí)現(xiàn)更有針對(duì)性的測(cè)試工作。 特定服務(wù)組件的回歸測(cè)試比整個(gè)單片應(yīng)用程序的回歸測(cè)試容易得多且更可行。此外,由于此模式中的服務(wù)組件松散耦合,因此從進(jìn)行變更的開發(fā)角度看的很少能夠影響應(yīng)用程序的另一部分,減輕了測(cè)試整個(gè)應(yīng)用程序的一個(gè)小的變化的測(cè)試負(fù)擔(dān)。

性能(Performance)

  • 級(jí)別:低
  • 分析:雖然您可以創(chuàng)此模式實(shí)現(xiàn)的應(yīng)用程序執(zhí)行非常好,但由于微服務(wù)架構(gòu)模式的分布式特性,這種模式本身并不適合高性能應(yīng)用程序。

可擴(kuò)展性(Scalability)

  • 級(jí)別:高
  • 分析:由于應(yīng)用程序分為單獨(dú)部署的單元,每個(gè)服務(wù)組件可以單獨(dú)縮放,允許對(duì)應(yīng)用程序進(jìn)行微調(diào)縮放. 例如,由于該功能的低用戶量,股票交易應(yīng)用的管理區(qū)域可能不需要縮放,但是交易布置組件需要包含縮放功能,由于大多數(shù)交易應(yīng)用為此所需的高吞吐量.

開發(fā)容易度(Ease of development)

  • 級(jí)別:高
  • 分析:由于功能被隔離到單獨(dú)的和不同的服務(wù)組件中,由于較小和隔離的范圍,開發(fā)變得更容易. 開發(fā)人員對(duì)一個(gè)服務(wù)組件進(jìn)行更改會(huì)影響其他服務(wù)組件的機(jī)會(huì)少得多,從而減少了開發(fā)人員或開發(fā)團(tuán)隊(duì)之間的協(xié)調(diào)。

5.云架構(gòu)(Space-Based Architecture)

大多數(shù)基于Web的業(yè)務(wù)應(yīng)用程序都遵循相同的一般請(qǐng)求流:一個(gè)來自瀏覽器的請(qǐng)求發(fā)送至Web服務(wù)器,然后是應(yīng)用程序服務(wù),最后是數(shù)據(jù)庫服務(wù).雖然此模式對(duì)于一小部分用戶非常有用,但是隨著用戶負(fù)載的增加,瓶頸開始首先出現(xiàn)在Web服務(wù)器層,然后在應(yīng)用程序服務(wù)器層,最后在數(shù)據(jù)庫服務(wù)器層?;谟脩糌?fù)載增加的瓶頸的應(yīng)對(duì)方案通常是是向外擴(kuò)展web服務(wù)器.這是相對(duì)容易和便宜的,通常能順利解決問題.但是,在大多數(shù)用戶負(fù)載較高的情況下,擴(kuò)展Web服務(wù)器層只是將瓶頸移動(dòng)到應(yīng)用程序服務(wù)器.縮放應(yīng)用程序服務(wù)器可能比Web服務(wù)器更復(fù)雜和昂貴,通常只是將瓶頸移動(dòng)到數(shù)據(jù)庫服務(wù)器,這是更加困難和昂貴的擴(kuò)展。即使你可以擴(kuò)展數(shù)據(jù)庫,你最終得到的是一個(gè)三角形拓?fù)?triangleshaped),三角形的最寬部分是Web服務(wù)器(最容易擴(kuò)展),最小的部分是數(shù)據(jù)庫(最難以擴(kuò)展).

在任何具有極大并發(fā)用戶負(fù)載的大容量應(yīng)用程序中,數(shù)據(jù)庫能夠同時(shí)處理多少事務(wù)是最終限制因素.雖然各種緩存技術(shù)和數(shù)據(jù)庫擴(kuò)展產(chǎn)品有助于解決這些問題,但事實(shí)仍然是,擴(kuò)展正常應(yīng)用程序解決極端負(fù)載問題是一個(gè)非常困難的命題.

基于云的架構(gòu)模式專門設(shè)計(jì)用于處理和解決可擴(kuò)展性和并發(fā)性問題.對(duì)于具有可變和不可預(yù)測(cè)的并發(fā)用戶卷的應(yīng)用程序,它也是一種有用的體系結(jié)構(gòu)模式.在架構(gòu)上解決極端和可變的可伸縮性問題通常是比將數(shù)據(jù)庫擴(kuò)展或?qū)⒕彺婕夹g(shù)改進(jìn)更好。

模式描述(Pattern Description)

基于空間的模式(有時(shí)也稱為云架構(gòu)模式)將限制應(yīng)用程序縮放的因素將至最低. 這個(gè)模式顧名思義,來源于從元組空間( tuple space)的概念和分布式共享內(nèi)存的概念得。 通過去掉中央數(shù)據(jù)庫約束并使用復(fù)制的內(nèi)存數(shù)據(jù)網(wǎng)格實(shí)現(xiàn)高可擴(kuò)展性。 應(yīng)用數(shù)據(jù)保存在內(nèi)存中并在所有活動(dòng)處理單元之間復(fù)制.當(dāng)用戶負(fù)載增加和減少時(shí),處理單元可以動(dòng)態(tài)地啟動(dòng)和關(guān)閉,從而解決可變的可擴(kuò)展性。 因?yàn)闆]有中央數(shù)據(jù)庫,所以去掉了數(shù)據(jù)庫瓶頸,在應(yīng)用程序中提供了近乎無限的可擴(kuò)展性.

大多數(shù)符合此模式的應(yīng)用程序是從瀏覽器接收請(qǐng)求并執(zhí)行某種操作的標(biāo)準(zhǔn)網(wǎng)站. 招標(biāo)拍賣網(wǎng)站就是一個(gè)很好的例子. 該網(wǎng)站通過瀏覽器請(qǐng)求不斷接收互聯(lián)網(wǎng)用戶的出價(jià). 應(yīng)用程序?qū)⒔邮諏?duì)特定項(xiàng)目的出價(jià),記錄具有時(shí)間戳的出價(jià),并且更新項(xiàng)目的最新出價(jià)信息,并將信息發(fā)送回瀏覽器。

此架構(gòu)模式中有兩個(gè)主要組件:處理單元(processing unit)和虛擬中間件(virtualized middleware). 圖5-1說明了基本的基于空間的架構(gòu)模式及其主要架構(gòu)組件。

圖5-1 云架構(gòu)

處理單元組件包含應(yīng)用組件(或應(yīng)用組件的部分). 這包括基于web的組件以及后端業(yè)務(wù)邏輯.處理單元的內(nèi)容基于應(yīng)用的類型而變化 - 較小的基于web的應(yīng)用可能被部署到單個(gè)處理單元中,而較大的應(yīng)用可基于應(yīng)用的功能區(qū)域?qū)?yīng)用功能分割成多個(gè)處理單元。 處理單元通常包含應(yīng)用程序模塊,以及內(nèi)存中數(shù)據(jù)網(wǎng)格和可選的異步持久存儲(chǔ)器,防止異常丟失數(shù)據(jù). 它還包含復(fù)制引擎,虛擬化中間件使用復(fù)制引擎將一個(gè)處理單元所做的數(shù)據(jù)更改復(fù)制到其他活動(dòng)處理單元。

虛擬化中間件組件處理管理和通信.它包含控制數(shù)據(jù)同步和請(qǐng)求處理的各個(gè)方面的組件.虛擬化中間件中包含消息傳遞網(wǎng)格,數(shù)據(jù)網(wǎng)格,處理網(wǎng)格和部署管理器. 這些組件在下一節(jié)中有詳細(xì)描述,可以定制或作為第三方產(chǎn)品購買。

Pattern Dynamics

基于空間的架構(gòu)模式的魔力在于虛擬化的中間件組件和包含在每個(gè)處理單元內(nèi)的內(nèi)存數(shù)據(jù)網(wǎng)格.圖5-2顯示了典型的處理單元架構(gòu),包含應(yīng)用程序模塊,內(nèi)存數(shù)據(jù)網(wǎng)格,用于故障轉(zhuǎn)移的可選異步持久存儲(chǔ)以及數(shù)據(jù)復(fù)制引擎.

圖5-2 處理單元

虛擬化中間件本質(zhì)上是架構(gòu)的控制器,并且管理請(qǐng)求,會(huì)話,數(shù)據(jù)復(fù)制,分布式請(qǐng)求處理和過程單元部署.在虛擬化中間件中有四個(gè)主要的架構(gòu)組件:消息傳遞網(wǎng)格,數(shù)據(jù)網(wǎng)格,處理網(wǎng)格和部署管理器.

消息網(wǎng)格(Messaging Grid)

消息網(wǎng)格(如圖5-3所示)管理輸入請(qǐng)求和會(huì)話信息。 當(dāng)一個(gè)請(qǐng)求進(jìn)入虛擬化中間件組件時(shí),消息傳遞網(wǎng)格組件確定哪些活動(dòng)處理組件可用于接收請(qǐng)求,并將請(qǐng)求轉(zhuǎn)發(fā)到這些處理單元之一.消息網(wǎng)格的復(fù)雜性可以從簡(jiǎn)單的循環(huán)算法到更復(fù)雜的 臨近可用算法(next-available algorithm),保持跟蹤由哪個(gè)處理單元處理哪個(gè)請(qǐng)求。

圖5-3 消息網(wǎng)格組件

數(shù)據(jù)網(wǎng)絡(luò)(Data Grid)

數(shù)據(jù)網(wǎng)格組件可能是這種模式中最重要和最重要的組件. 數(shù)據(jù)網(wǎng)格利用每個(gè)處理單元中的數(shù)據(jù)復(fù)制引擎,當(dāng)數(shù)據(jù)更新發(fā)生時(shí),管理單元之間的數(shù)據(jù)復(fù)制. 由于消息傳送網(wǎng)格可以向任何可用的處理單元轉(zhuǎn)發(fā)請(qǐng)求,因此每個(gè)處理單元在其內(nèi)存數(shù)據(jù)網(wǎng)格中包含完全相同的數(shù)據(jù)是必要的. 雖然圖5-4顯示了處理單元之間的同步數(shù)據(jù)復(fù)制,但實(shí)際上這是以異步和非常快速的并行方式完成的,有時(shí)在幾微秒(百萬分之一秒)內(nèi)完成數(shù)據(jù)同步.

圖5-4 數(shù)據(jù)網(wǎng)絡(luò)組件

處理網(wǎng)格(Processing Grid)

如圖5-5所示,處理網(wǎng)格是虛擬化中間件中的一個(gè)可選組件,當(dāng)存在多個(gè)處理單元(每個(gè)單元處理應(yīng)用程序的一部分)時(shí)管理分布式請(qǐng)求處理.如果進(jìn)入需要處理單元類型(例如,訂單處理單元和客戶處理單元)之間的協(xié)調(diào)的請(qǐng)求,則是在這兩個(gè)處理單元之間中介和協(xié)調(diào)請(qǐng)求的處理網(wǎng)格。

圖5-5 處理網(wǎng)絡(luò)組件

部署管理(Deployment Manager)

部署管理器組件根據(jù)負(fù)載條件管理處理單元的動(dòng)態(tài)啟動(dòng)和關(guān)閉.該組件持續(xù)監(jiān)視響應(yīng)時(shí)間和用戶負(fù)載,并在負(fù)載增加時(shí)啟動(dòng)新的處理單元,并在負(fù)載減少時(shí)關(guān)閉處理單元.它是在應(yīng)用程序中實(shí)現(xiàn)可變可擴(kuò)展性需求的關(guān)鍵組件.

注意事項(xiàng)(Considerations)

基于云架構(gòu)模式是一個(gè)實(shí)現(xiàn)復(fù)雜和昂貴的模式. 對(duì)于具有可變負(fù)載且規(guī)模較小的基于網(wǎng)絡(luò)的應(yīng)用(例如,社交媒體網(wǎng)站,競(jìng)價(jià)和拍賣網(wǎng)站),這是一種良好的架構(gòu)選擇。 然而,它不太適合具有大量操作數(shù)據(jù)的傳統(tǒng)大規(guī)模關(guān)系數(shù)據(jù)庫應(yīng)用程序。

盡管基于空間的架構(gòu)模式不需要集中式數(shù)據(jù)存儲(chǔ),但是需要用于執(zhí)行初始內(nèi)存數(shù)據(jù)網(wǎng)格加載和異步保持由處理單元進(jìn)行的數(shù)據(jù)更新。 常見的做法是創(chuàng)建將易失性和廣泛使用的事務(wù)數(shù)據(jù)與非活動(dòng)數(shù)據(jù)隔離的單獨(dú)分區(qū),以便減少每個(gè)處理單元內(nèi)的內(nèi)存數(shù)據(jù)網(wǎng)格的存儲(chǔ)器占用。

需要著重注意的是,雖然這種模式的替代名稱是基于云的架構(gòu),但是處理單元(以及虛擬化中間件)不一定要駐留在基于云的托管服務(wù)或PaaS(平臺(tái)即服務(wù))上, 它可以很容易駐留在本地服務(wù)器上,這是我更喜歡名為“基于空間的架構(gòu)”的原因之一。

從產(chǎn)品實(shí)現(xiàn)的角度來看,您可以通過第三方產(chǎn)品(如GemFire,JavaSpaces,GigaSpaces,IBM Object Grid,nCache和Oracle Coherence)實(shí)現(xiàn)此模式中的許多架構(gòu)組件.由于此模式的實(shí)施在成本和功能(特別是數(shù)據(jù)復(fù)制時(shí)間)方面有很大差異,因此作為架構(gòu)師,您應(yīng)首先確定具體目標(biāo)和需求,然后再進(jìn)行任何產(chǎn)品選擇.

模式分析(Pattern Analysis)

該章節(jié)包含事件驅(qū)動(dòng)架構(gòu)模式的常見架構(gòu)特性的評(píng)級(jí)和分析。 每個(gè)特性的評(píng)級(jí)基于自然趨勢(shì)或該特性作為基于圖案的典型實(shí)施的能力,以及通常已知的圖案。 對(duì)于此模式與本報(bào)告中其他模式如何相關(guān)的并行比較,請(qǐng)參見本報(bào)告末尾的附錄A.

靈活性(Overall agility)

  • 級(jí)別:高
  • 分析:總體靈活性是對(duì)不斷變化的環(huán)境做出快速反應(yīng)的能力.因?yàn)樘幚韱卧☉?yīng)用的所部署的實(shí)例)可以快速進(jìn)行調(diào)整,所以應(yīng)用對(duì)于與用戶負(fù)載(環(huán)境變化)的變化能夠很好的地響應(yīng).使用該模式創(chuàng)建的結(jié)構(gòu)通常對(duì)由于應(yīng)用程序的大小和模式的動(dòng)態(tài)特性。

可部署性(Ease of deployment)

  • 級(jí)別:高
  • 分析:雖然基于空間的架構(gòu)通常不是解耦和分布式的,但它們是動(dòng)態(tài)的,復(fù)雜的基于云的工具允許應(yīng)用程序輕松地“推送”到服務(wù)器,簡(jiǎn)化部署。

可測(cè)試性(Testability)

  • 級(jí)別:低
  • 分析:在測(cè)試環(huán)境中實(shí)現(xiàn)非常高的用戶負(fù)載既昂貴又耗時(shí),使得難以測(cè)試應(yīng)用的可擴(kuò)展性方面。

性能(Performance)

  • 級(jí)別:高
  • 分析:通過內(nèi)存數(shù)據(jù)訪問和緩存機(jī)制構(gòu)建到此模式中來實(shí)現(xiàn)高性能。

可擴(kuò)展性(Scalability)

  • 級(jí)別:高
  • 分析:高可擴(kuò)展性來自于對(duì)集中式數(shù)據(jù)庫的依賴很少或沒有依賴性,因此基本上從可擴(kuò)展性方程中去除了這個(gè)限制性瓶頸。

開發(fā)容易度(Ease of development)

  • 級(jí)別:低
  • 分析:復(fù)雜的緩存和內(nèi)存數(shù)據(jù)網(wǎng)格產(chǎn)品使得這種模式開發(fā)起來相對(duì)復(fù)雜,主要是因?yàn)槿狈?duì)用于創(chuàng)建這種類型的架構(gòu)的工具和產(chǎn)品的熟悉.此外,在開發(fā)這些類型的體系結(jié)構(gòu)時(shí)必須特別小心,以確保源代碼中不會(huì)影響性能和可伸縮性

附錄A

圖A-1 架構(gòu)分析概述

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容