最近再看阮一峰的一篇博客提到了一本書《Software Architecture Patterns》(PDF)
,寫的不錯,雖然英語很屎,過年找點事干,試著翻(gu)譯(ge)一下.以下為翻譯的內容,祝我能夠翻譯完,并借此機會能夠加深對架構的認識。
ps:建議看英文原著。
ps:[ ]中的話是我說的。
ps:好吧,我找到已經有一個翻譯版本了(https://github.com/hehonghui/android-tech-frontier/tree/master/software-architecture-patterns)
早看到就不翻譯了......
介紹
開發人員在沒有合適架構的情況下開始編寫程序是非常普遍的情況. 在這種情況下,大多數開發人員和架構師會采用傳統分層架構模式(也稱為n層架構),通過將源碼模塊分成各種包來表示抽象層。不幸的是,這種做法經常導致的是一個混亂的源碼結構,它們缺乏明確的角色,職責和彼此之間的關系。 這通常被稱為反模式的大泥球。
沒有通過架構設計的應用程序通常緊密耦合,脆弱,難以改變,沒有清晰結構。如果沒有完全理解系統中的每個組件和模塊的內部工作原理的情況下,確定程序的架構特性會是非常困難的事情。關于程序部署和維護的基本問題也會很難回答:架構是否具有可擴展性?應用程序的性能如何? 程序是否能夠應對變化?程序如何部署?架構的響應能力如何?
架構模式有助于定義應用程序的基本特征和行為。 例如,一些架構模式非常適合需要高可擴展性的應用程序,一些架構模式則適用于非常靈活的應用程序。 只有了解各種架構模式的優勢和弱點,才能夠選擇出滿足自己業務特點和目標的架構模式。
作為一個架構師,你必須證明你的架構決策,特別是當涉及到選擇一個特定的架構模式或方法。 這篇文正的目的是為您提供足夠的信息,以證明你的選擇是OK的。
1.分層架構(Layered Architecture)
分層架構是最常見的架構,也是javaee應用程序的標準模式,并被多數開發人員了解。這種架構適合于傳統IT通信和組織結構,成為大多數業務應用程序開發工作的自然選擇。
模式描述(Pattern Description)
該架構中每一層都包含多個組件并且擁有具體的職責(例如顯示邏輯、業務邏輯)。該架構并不嚴格規定層的類型和層數,多數分層架構包含視圖層、業務層、持久化層和數據庫層(圖1-1)。有時,業務層和持久層被合并為單個業務層,特別是當持久性邏輯(例如,生成SQL或HSQL)嵌入到業務層組件中。因此,較小的應用可以僅具有三個層,而大的應用可以包含五個或更多個層[對于多數應用四層足以]。
分層架構模式的每一層在應用程序中都有特定的角色和職責。例如,表示層將負責處理所有的用戶界面邏輯,而業務層負責響應表示層的請求并執行相應的業務邏輯。架構中的每一層都圍繞需要完成的工作形成抽象,以滿足特定的業務請求。例如,表示層不需要知道或擔心如何獲得客戶數據;它只需要在特定格式的屏幕上顯示該信息。類似地,業務層不需要關心如何格式化客戶數據以在屏幕上顯示或者甚至在客戶數據來自哪里;它只需要從持久層獲得數據,對數據執行業務邏輯(例如,計算值或聚合數據),并將該信息傳遞到表示層。
分層架構模式的一個強大的功能是組件之間的關注點分離(separation of concerns)。 特定層中的組件僅處理與該層相關的邏輯。 例如,表示層中的組件只處理表示邏輯,而業務層的組件只處理業務邏輯。 這種組件分類方式使您可以輕松地在您的架構中構建有用的模型,并且由于定義明確的組件接口和有限的組件范圍,還可以輕松地使用此架構模式開發,測試,管理和維護應用程序。
關鍵概念(Key Concepts)
在圖1-2中,架構中的每個層都標記為封閉。這是分層架構模式中非常重要的概念。 關閉意味著當請求從一個層移動到另一個層時,它必須經過它的下層,才能到達目的層。 例如,一個請求從表示層要到數據庫層就必須經過業務層和持久層。
那么為什么不允許表示層直接訪問持久層或數據庫層? 畢竟,從表示層的直接數據庫訪問比通過一堆不必要的層來檢索或保存數據庫信息要快得多。 這個問題的答案在于一個被稱為隔離層(layers of isolation)的關鍵概念。
隔離層意味著在一個層的變化通常不會影響到其它層的組件。 如果你允許表示層直接訪問持久層,那么持久層的變化將會同時影響業務層和表示層, 從而產生了非常緊密耦合和組件之間的依賴性。當需求發生變化時,這種架構將會付出較大的代價。
隔離概念的層還意味著每個層獨立于其他層,并且不需要知道其它層是如何工作的。 為了理解這個概念的重要性,考慮一個大規模的重構,將展示框架從JSP(Java服務器頁面)修改為JSF(Java服務器面。假設在表示層和業務層之間使用的契約(contracts)(例如,模型)保持相同,則業務層不受重構的影響并且完全和表示層保持獨立。
雖然封閉的層有助于層次之間的隔離,從而提高了架構的低耦合設計,但有時候某些層被打開是有意義的。 例如,假設您要增加一個共享服務層向業務層的組件提供服務(例如,數據和字符串實用程序類或審計和日志記錄類)。 在這種情況下創建服務層通常是一個好主意,因為在體系結構上,它將對共享服務的訪問限制為業務層(而不是表示層)。 沒有單獨的層,在架構上沒有限制表示層訪問這些公共服務,使得難以管理該訪問限制[這句話沒看懂,回頭再看]。
在該示例中,新服務層可能駐留在業務層之下,同時表明該服務層中的組件不能被表示層訪問。 然而,這衍生出一個新的問題,業務層需要經過服務層以到達持久層,但這根本沒有意義。 這是分層架構的一個古老的問題,需要通過在架構內創建開放層來解決。
如圖1-3所示,在這種情況下,服務層被標記為打開,意味著改層可以被繞過。 在以下示例中,由于服務層是打開的,因此業務層現在允許繞過它,并直接轉到持久層,這是完全合理的。
利用開放層和封閉層的概念有助于定義層次和請求流之間的關系,并且向設計者和開發者提供理解架構內的各種層訪問限制的必要信息。如果不能確定架構中的哪些層是開放和封閉的(以及為什么)通常會導致架構難以測試,維護和部署的緊密耦合和脆弱。
架構例子(Pattern Example)
為了說明分層架構的工作原理,考慮一個來自用戶檢索客戶信息的請求,如圖1-4所示。 黑色箭頭顯示請求流向數據庫以檢索客戶數據,紅色箭頭顯示響應返回到屏幕以顯示數據。 在該示例中,客戶信息包括客戶數據和訂單數據(由客戶下達的訂單)。
如圖所示,customer screen模塊負責接受用戶請求并顯示客戶信息,它不知道數據在哪里,如何檢索,也不了解數據庫,該模塊收到查詢客戶信息的請求后,將該請求轉發到customer delegate模塊,該模塊負責了解業務層中哪些模塊可以處理該請求,以及如何獲取該模塊需要的數據(例如合同數據)。業務層中的custom object負責收集(aggregating)業務請求所需的所有信息(該例子中是指客戶信息)。該模塊調用customer dao(數據訪問對象)模塊在持久層中獲取客戶數據,并且還通過order dao模塊獲取訂單信息。這些模塊又執行SQL語句來檢索相應的數據,并將其傳回給業務層中的customer object模塊。一旦customer object接收到數據,它整合數據并將該信息傳遞回customer delegate,然后將該數據傳遞到customer screen以呈現給用戶。
從技術的角度來看,這些模塊可以有很多實現方式。 例如,在Java平臺中,customer screen模塊可以是(JSF) Java Server Faces screen,它和customer delegage可以作為被管理的bean組件 。業務層中的customer object可以是本地Spring bean對象或遠程EJB3 bean對象。 之前示例中的客戶和訂單數據可以由POJO,MyBatis XML Mapper,甚至可以是JDBC調用或Hibernate查詢返回的數據封裝。 在Microsoft平臺中,customer screen可以是基于.net技術體系ASP(活動服務器頁面)模塊,客戶和訂單數據可以由為ADO(ActiveX數據對象)實現。
注意事項(Considerations)
分層架構是比較實用并且通用的模式,對于多數程序是一個良好起點,尤其是當您不確定哪種架構模式最適合您的應用程序時。 當選擇這種模式時,你需要從架構的角度來考慮一下幾點。
要注意的第一件事是所謂的污水池反模式(architecture
sinkhole anti-pattern)[誰能解釋一下這是啥意思]。 這個反模式是這樣的,請求流簡單的穿過幾個層,每層里面基本沒有做任何業務邏輯,或者做了很少的業務邏輯。 例如,假設表示層響應來自用戶的檢索客戶數據的請求。 表示層將請求傳遞給業務層,業務層簡單地將請求傳遞給持久層,然后對數據庫層進行簡單的SQL調用以檢索客戶數據。 然后,數據一路返回,沒有用于聚集(aggregate),計算或變換數據的額外處理或邏輯。
每個分層架構將具有至少一些落入反模式(architecture
sinkhole anti-pattern)的情況。 這里面的關鍵是分析出屬于此類別的請求的百分比。 80-20規則通常是一個良好的做法,以確定是否正在經歷這種情況。通常將大約20%的請求作為簡單傳遞處理,80%的請求具有與請求相關聯的某些業務邏輯。 但是,如果您發現此比例相反,并且大多數請求是簡單的直通處理,您可能需要考慮使一些架構層打開,需要注意的是這樣會讓層次的耦合度提高,使軟件變得不易改變。
分層體系結構模式需要注意的另一個問題是,它會使得應用程序變得monolithic[這個詞不知道怎么翻譯合適],即使你將表示層和業務層分成單獨的可部署單元。 雖然某些應用程序不在乎這些問題[規模小的程序],但它的確會帶來部署,通用魯棒性和可靠性,性能和可擴展性等方面的一些潛在問題。
模式分析(Pattern Analysis)
以下內容包含分層架構模式的常見架構特性的評級和分析。每個特性的評級基于適用于該模式的普通場景。 對于此模式與本報告中其他模式如何相關的并行比較,請參見本報告末尾的附錄A.
靈活性(Overall agility)
- 級別:低
- 分析:靈活性是針對不斷變化的環境做出快速反應的能力。 雖然可以通過該模式的層次隔離特點來應對變化,但是由于monolithic性質和這種模式帶來的組件間緊耦合的特性,在該體系結構模式中進行改變仍然是繁瑣和耗時的。
可部署性(Ease of deployment)
- 級別:低
- 分析:對于由該模式實現的大型應用程序來講,部署可能會是一個問題 。對組件的一個小改變可能需要重新部署整個應用程序(或應用程序的大部分),導致需要加班進行規劃,調度和執行的部署。因此,此模式不適合進行可持續部署,進一步降低了部署的總體評級。
可測試性(Testability)
- 級別:高
- 分析:因為組件都隸屬于某層,而且其他層可以被插樁或者模擬,所以該模式相對容易測試。 開發人員可以通過模擬展示層中的組件中進行業務層中組件的測試,或者模擬業務層以測試某些展示層組件的功能。
性能(Performance)
級別:低
分析:雖然一些分層架構可以很好地執行,但是由于必須經歷架構的多個層以滿足業務請求,效率較低,所以該模式不適用于高性能應用。
可擴展性(Scalability)
- 級別:低
- 分析:由于這種模式的緊密耦合和monolithic特點,使用此架構模式的應用程序構建通常難以擴展。 您可以通過將層拆分為單獨的物理部署或將整個應用程序復制到多個節點來擴展分層體系結構,但總體來說,粒度太分散,這使其擴展成本昂貴。
開發容易度(Ease of development)
- 級別:高
- 分析:易于開發獲得相對高的分數,主要是因為這種模式是如此眾所周知的,并且實現起來不太復雜。 因為大多數公司通過分層(界面,業務,數據庫)分離技能集來開發應用程序,所以這種模式成為大多數業務應用程序開發的自然選擇。 公司的溝通和組織結構之間的聯系以及開發軟件的方式被概述了所謂的 Conway’s law。
2.事件驅動架構(Event-Driven Architecture)
事件驅動架構模式是一個構建高擴展性程序的分布式異步架構模式。 它還具有高度適應性,可用于小型應用和大型大型應用或者是復雜的應用。事件驅動架構由異步接收、處理事件的組件構成,這些組件是高度解耦和職責單一的。
事件驅動的架構模式由兩種拓撲(topology)方式,即mediator和broker。當你想要在事件內編排一些步驟時需要mediator拓撲[wtf這句話],而當您想要將事件鏈接在一起而不使用中央mediator時,你需要broker拓撲。因為這兩種拓撲結構的架構特性和實現策略不同,所以了解每一種拓撲結構最適合您的特定情況是非常重要的。
Mediator拓撲(Mediator Topology)
Mediator拓撲適用于事件需要經過多個步驟處理的情況。 例如,進行股票交易的一個事件可能需要您首先驗證交易,然后檢查該股票交易是否符合各種合規規則,將交易分配給經紀人,計算傭金,最后完成交易。 所有這些步驟需要進行精心的安排,從而可以順序的執行.
在Mediator拓撲又四部分組成:事件隊列,事件mediator,事件通道和事件處理器.事件流從客戶端向事件隊列發送事件開始,事件隊列用于將事件傳輸到事件mediator.事件mediator接收事件后,通過向事件通道發送異步事件來執行該事件的每個處理步驟.事件處理器監聽事件通,并執行特定的業務邏輯來處理事件。 圖2-1說明了事件驅動架構模式的Mediator拓撲.
在事件驅動架構中,通常有十幾到幾百個事件隊列。 該模式不指定事件隊列組件的實現; 它可以是消息隊列,web服務端點或者其他什么東西。
該模式中有兩種類型的事件:初始事件和處理事件.初始事件是由調解器接收的原始事件,而處理事件是由調解器生成并且由事件處理組件接收的事件。
事件mediator 組件負責協調初始事件中包含的步驟。 對于初始事件中的每一步,事件mediator將特定的處理事件發送到事件通道,然后由事件處理器接收并處理。 重要的是注意事件mediator實際上不執行處理初始事件所必需的業務邏輯; 它只知道處理初始事件所需的步驟。
事件通道被事件mediator異步地將初始事傳遞給事件處理模塊. 事件通道可以是消息隊列或消息topics,盡管消息topics和mediator拓撲通常放在一起使用的更多一些,使得處理事件可以由多個事件處理器(每個事件處理器基于接收到的處理事件執行不同的任務)來處理[我感覺這里消息隊列和消息topics是兩個并列的概念,消息topics是指的是每個事件都能被處理模塊得到,有點像pub/sub,而消息隊列指的是每個事件只能又一個處理模塊得到,有點像pipeline]。
事件處理器組件包含處理處理事件所需的業務邏輯代碼。 事件處理器是在應用或系統中執行特定任務的自包含的(self-contained),獨立的,低耦合的架構組件[就是指業務模塊]。盡管事件處理器組件的粒度可以從細粒度(例如,計算訂單上的銷售稅)到 粗粒度(例如,處理保險索賠),重要的是每個事件處理器組件應該執行單個業務任務,而不依賴于其他事件處理器完成其特定任務[業務模塊之間不應該產生相互依賴]。
事件mediator可以以多種方式實現. 作為架構師,您應該了解每個細節,以確保該模式的解決方案符合您的需求。
事件mediator的最簡單和最常見的實現是通過開源框架,例如Spring Integration,Apache Camel或Mule ESB.這些開源集成中心中的事件流通常通過Java代碼或DSL(領域專用語言)實現。 對于更復雜的中介和編排,您可以使用BPEL(domain-specific language)以及BPEL引擎(如開放源代碼Apache ODE)。 BPEL是一種標準的類似XML的語言,它描述了處理初始事件所需的數據和步驟。 對于需要更復雜的編排(包括涉及人員交互的步驟)的非常大的應用程序,您可以使用業務流程管理器(BPM)(如jBPM)實現事件仲裁器。
理解您的需求并選擇合適的事件mediator實現,對使用此拓撲的任何事件驅動成功至關重要。 使用開源集成中心來執行非常復雜的業務流程管理編排是不正確的,就像實施一個BPM解決方案來執行簡單的路由邏輯一樣[宰牛不能用殺雞刀,殺雞不能用宰牛刀]。
為了說明mediator拓撲是如何工作的,假設你通過保險公司投保,并決定修改。 在這種情況下,初始事件可能被稱為重定位事件(relocation
event)。 處理重定位事件涉及的步驟包含在事件mediator中,如圖2-2所示。 對于每個初始事件步驟,事件中介器創建處理事件(例如,改變地址,重新計算報價等),將該處理事件發送到事件信道,并等待由相應的事件處理器處理的處理事件(例如 ,客戶過程,報價過程等)。 該過程繼續,直到初始事件中的所有步驟都已被處理。 在Event Mediator中,Recalc Quate和Update Claims上面的箭頭代表這兩個步驟可同時進行。
Broker拓撲架構[broker就是代理的意思]
Broker拓撲不同于mediator拓撲,因為沒有中心事件mediator,消息通過輕量級消息代理(例如,ActiveMQ,HornetQ等)[Rabbitmq,zeromq]發布給業務組件。 當您具有相對簡單的事件處理流,并且您不需要中心mediator去安排更上層的業務流程,此拓撲非常有用[適合多數業務不太復雜的系統]。
該拓撲中有兩種主要類型的架構組件:代理組件和事件處理器組件。 代理組件可以是一個或者好幾個(centralized or federated),并且包含了所有的事件通道,這些通道涵蓋在事件流內。代理組件中包含的事件通道可以是消息隊列,消息主題發布或兩者的組合。
此拓撲如圖2-3所示。 從圖中可以看出,沒有event-mediator組件來控制和編排初始事件; 相反,每個事件處理器組件負責處理事件并發布事件處理結果。 例如,平衡股票投資組合的事件處理器可以接收稱為股票分割的初始事件。 基于該初始事件,事件處理器可以進行一些組合重新平衡,然后向代理發布稱為重新平衡組合的新事件,其然后將由不同的事件處理器拾取。 注意,可能存在事件由事件處理器發布但是沒有別的處理器接受的情況出現。這是常見的,尤其是當您正在開發應用程序或提供未來的功能和擴展。
為了說明代理拓撲如何工作,我們將使用與mediator拓撲中相同的示例。由于沒有中央事件mediator來接收代理拓撲中的初始事件,客戶過程組件直接接收事件,改變客戶地址,并且發出該地址改變事件。在此示例中,有兩個對更改地址事件感興趣的事件處理器:報價過程和聲明過程。報價處理器組件根據地址更改重新計算新的自動保險率,并向系統的其余部分發布事件指示它做的事情(例如,重新計算報價事件)。另一方面,聲明處理組件接收相同的改變地址事件,但是在這種情況下,它更新未完成的保險聲明并且向系統發布事件作為更新聲明事件。這些新事件隨后被其他事件處理器組件拾取,并且事件鏈繼續通過系統,直到不再有針對該特定啟動事件發布的事件.[這不就是pr系統的設計嘛]
從圖2-4中可以看出,代理拓撲結構都是關于執行業務功能的事件總線。 理解代理拓撲的最好方法是將其視為中繼競賽。在接力賽中,跑步者持有接力棒并運行一定距離,然后將指揮棒交給下一個跑步者,依此類推 直到最后一個運動員穿過終點線。 在接力賽中,一旦運動員交出指揮棒,她就完成了比賽。 這對于代理拓撲也是如此:一旦事件處理器切換事件,它不再參與該特定事件的處理。
注意事項(Considerations)
事件驅動的架構模式是一個相對復雜的模式實現,主要是由于它的異步的特點。當實現這種模式時,您必須解決各種分布式架構問題,如遠程進程可用性,缺乏響應性和代理重新連接邏輯 事件代理或mediator失敗。
這種架構模式適用于缺少原子性事務的業務流程。 因為事件處理器組件是高度去耦合和分布式的,所以很難跨越多個業務組件的同時去維護業務的事務特點[ACID]。 因此,在使用此模式設計應用程序時,必須不斷考慮哪些事件可以獨立運行或者不單獨運行,并相應地計劃事件處理器的粒度。 如果您發現由多個事件處理器構成一個工作單元,換句話說,如果您使用分散的處理器來處理不可分割的事務,在這種情況下,該模式可能不適合您的應用程序。
事件驅動的架構模式的最困難的方面之一可能是事件處理器組件之間契約(contracts)的創建,維護和管理。 每個事件通常具有與它相關聯的契約形式(例如,數據值和數據格式).使用此模式來建立標準數據格式(例如,XML,JSON,Java對象等)并從一開始就建立契約的版本控制策略至關重要[業務模塊之間的接口很重要,也非常容易發生變化!!!]。
模式分析(Pattern Analysis)
該章節包含事件驅動架構模式的常見架構特性的評級和分析。 每個特性的評級基于自然趨勢或該特性作為基于圖案的典型實施的能力,以及通常已知的圖案。 對于此模式與本報告中其他模式如何相關的并行比較,請參見本報告末尾的附錄A.
靈活性(Overall agility)
- 級別:高
- 分析:靈活性是指軟件應對變化的能力。 由于事件處理器組件是職責單一的的并且與其他事件處理器組件完全解耦,因此改變通常被隔離到一個或幾個事件處理器內,并且可以快速地做出改變而不影響其他組件.
易部署性(Ease of deployment)
- 級別:高
- 分析:總得來說,由于事件處理器組件的去耦特性,這種模式相對容易部署。 代理拓撲趨向于比中介器拓撲更易于部署,主要是因為事件中介器組件和事件處理組件是緊耦合的:事件處理器組件中的更改也可能需要事件介體進行更改,兩者都要進行重新部署.
可測試性(Testability)
- 級別:低
- 分析:雖然單個單元測試不是特別困難,但它需要某種專門的測試客戶端或測試工具來生成事件。 這種模式的異步性質也使測試復雜化。
性能(Performance)
- 級別:高
- 分析:雖然該架構的效率很大程度上取決于消息發送基礎結構,但是通常來說,該模式通過其異步能力實現高性能; 換句話說,執行解耦,并行異步操作的能力勝過入隊和出隊消息的成本。
可擴展性(Scalability)
- 級別:高
- 分析:由于擁有獨立和低耦合的事件處理器,該架構天生的具有高可擴展性。 每個事件處理器可以單獨縮放,允許細粒度可伸縮性。
開發容易度(Ease of development)
- 級別:低
- 分析:由于該模式異步的特性,需要建立契約,以及需要考慮針對代理錯誤以及異常事件的處理,該架構不同意上手.
3.微內核架構 (Microkernel Architecture)
微內核架構模式(有時稱為插件架構模式)是實現基于產品的應用程序所使用的模式。 基于產品的應用程序是作為典型的第三方產品被打包并提供下載的應用程序。 然而,許多公司也開發和發布其內部業務應用程序,如軟件產品,完整版本,發行說明和可插拔功能。 這些也是這種模式的典型應用。 微內核架構模式允許您將附加應用程序功能作為插件添加到核心應用程序,提供可擴展性以及功能分離和隔離。
架構描述
微內核架構模式由兩種類型的架構組件組成:核心系統和插件模塊。業務邏輯分開在獨立插件模塊和基本核心系統之間,這種方式提供功能和業務邏輯的可擴展性,靈活性和隔離的特點。 圖3-1說明了基本微內核架構模式.
微內核架構模式的核心系統僅包含使系統運行所需的最小功能集.許多操作系統實現了微內核架構模式,因此是該模式名稱的起源。從業務程序的角度來看,核心系統通常被定義為通用業務邏輯,不包含針對特殊情況或者復雜情況的自定義代碼.
插件模塊是獨立的獨立組件,包含特殊的處理,附加的功能和自定義代碼,用于增強或擴展核心系統以產生額外的業務功能。 通常,插件模塊應該獨立于其他插件模塊,但是您當然可以設計需要其他插件的插件。 無論哪種方式,重要的是保持插件之間的通信最小化,以避免依賴性問題。
核心系統需要知道哪些插件模塊可用以及如何獲取它們。 一種常見的實現方式是通過某種插件注冊表。 此注冊表包含有關每個插件模塊的信息,包括其名稱,數據結構和遠程訪問協議詳細信息(取決于插件如何連接到核心系統). 例如,用于標記高風險稅務審計項目的稅務軟件的插件可能具有包含服務名稱(AuditChecker),數據結構(輸入數據和輸出數據)和合同格式的注冊表項 (XML).如果插件通過SOAP訪問,它還可能包含WSDL(Web服務定義語言).
插件模塊可以通過各種方式連接到核心系統,包括OSGi(開放服務網關倡議),消息,web服務或甚至直接點對點綁定(即對象實例化)。 您使用的連接類型取決于您正在構建的應用程序類型(小型產品或大型業務應用程序)和您的特定需求(例如,單一部署或分布式部署)。 架構模式本身不指定任何這些實現細節,只有插件模塊必須保持彼此獨立。
插件模塊可以通過各種方式連接到核心系統,包括OSGi(開放服務網關倡議),消息,web服務或甚至直接點對點綁定(即對象實例化). 您使用的連接類型取決于您正在構建的應用程序類型(小型產品或大型業務應用程序)和您的特定需求(例如,單一部署或分布式部署).架構模式本身不指定任何這些實現細節,只有插件模塊必須保持彼此獨立。
插件模塊和核心系統之間的契約范圍可以從標準契約到自定義契約. 自定義契約通常在插件組件由第三方開發的情況下建立,其中您無法控制插件使用的契約。 在這種情況下,在插件契約和標準契約之間插入一個適配器,以便核心系統不需要每個插件都有專門的代碼。 在創建標準契約(通常通過XML或Java Map實現)時,務必記住從開始就創建版本控制策略。
模式例子(Pattern Examples)
內核架構的最好的例子是Eclipse IDE.下載基本的Eclipse產品只是一個漂亮的編輯器。 然而,一旦你開始添加插件,它就成為一個高度可定制和有用的產品。互聯網瀏覽器是另一個常見的產品示例使用微內核架構:查看器和其他插件添加額外的功能,在基本的瀏覽器 即核心系統)。
類似這種基于產品軟件的例子是挺多的,但是大型企業應用程序呢? 微內核架構也適用于這些情況。 為了說明這一點,讓我們使用另一個保險公司的例子,但這次涉及保險索賠處理。
索賠處理是一個非常復雜的過程。 每個地區對保險索賠中的內容都有不同的規則和的規定。 例如,當您的擋風玻璃被巖石損壞,一些地區允許更換擋風玻璃,而其他地區則不會。 這為標準索賠創建了一個很大的條件集合。
毫不奇怪,大多數保險索賠應用程序利用大型和復雜的規則引擎來處理這種復雜性。 然而,這些規則引擎可以成長為一個復雜的大泥球,其中改變一個規則影響其它規則,或者做一個簡單的規則改變就需要一支分析師,開發人員和測試人員的隊伍。 使用微內核架構模式可以解決許多這些問題。
圖3-2中顯示的文件夾堆棧表示聲明處理的核心系統。 它包含保險公司處理索賠所需的基本業務邏輯,不包含任何定制處理。 每個插件模塊包含該地區的特定規則。 在該示例中,可以使用定制源代碼或單獨的規則引擎實例來實現插件模塊。 不管實現如何,關鍵點是地區特定的規則和處理與核心聲明系統分離,并且可以進行添加,刪除和修改,并且對核心系統或其他插件模塊幾乎沒有影響.
結論(Considerations)
微內核架構模式的一個好處是它可以嵌入或用作另一個架構模式的一部分。例如,如果此模式解決了應用程序的特定易失性區域中存在的特定問題,您可能會發現不能使用這種模式實現整個架構。 在這種情況下,您可以將微服務架構模式嵌入您正在使用的另一個模式(例如,分層架構).類似地,可以使用微服務架構模式來實現在先前關于事件驅動架構的部分中描述的事件處理器組件.
微服務架構模式為進化設計和增量開發提供了極大的支持.您可以首先生成一個堅實的核心系統,隨著應用程序的不斷發展,添加功能和功能,而不必對核心系統進行重大更改。
對于基于產品的應用程序,微內核架構模式應始終是您的首選架構,特別是對于那些將隨著時間的推移發布其他功能,并希望控制不同用戶獲得不同的功能。 如果您發現該模式不能滿足您的所有需求,您可以隨時將您的應用程序重構為更適合您的特定需求的另一個架構模式。
模式分析(Pattern Analysis)
該章節包含事件驅動架構模式的常見架構特性的評級和分析。 每個特性的評級基于自然趨勢或該特性作為基于圖案的典型實施的能力,以及通常已知的圖案。 對于此模式與本報告中其他模式如何相關的并行比較,請參見本報告末尾的附錄A.
靈活性(Overall agility)
- 級別:高
- 分析:總體靈活性是對不斷變化的環境做出快速反應的能力.通過松散耦合的插件模塊.可以在很大程度上隔離和實現更改。 一般來說,大多數微內核架構的核心系統趨于快速穩定,因此相當穩健,并且很少需要隨時間變化。
可部署性(Ease of deployment)
- 級別:高
- 分析:根據如何實現模式,插件模塊可以在運行時動態地添加到核心系統(例如,熱部署),從而最小化部署期間的停機時間。
可測試性(Testability)
- 級別:高
- 分析:插件模塊可以進行隔離測試,并且可以很容易地被核心系統模仿以論證或原型化特定特征,而對核心系統的改變很少或沒有改變。
性能(Performance)
- 級別:高
- 分析:雖然微內核模式不適合高性能應用程序,但一般來說,使用微內核架構模式構建的大多數應用程序性能良好,因為您可以自定義和簡化應用程序,僅包含您需要的功能. JBoss應用服務器就是一個很好的例子:使用它的插件架構,你可以將應用服務器修剪到你需要的那些特性,消除昂貴的未使用的功能,例如遠程訪問,消息傳遞和消耗內存的緩存 ,CPU和線程等并減慢應用程序服務器.
可擴展性(Scalability)
- 級別:低
- 分析:因為大多數微內核架構實現是基于產品的,并且通常規模較小,所以它們被實現為單個單元,因此不是高度可擴展的。根據如何實現插件模塊,有時可以在插件功能級別提供可擴展性 ,但總的來說,這種模式對于生產高度可擴展的應用程序比較少。
開發容易度(Ease of development)
- 級別:低
- 分析:微內核架構需要周密的設計和合同管理,使其實現起來相當復雜.契約版本控制,內部插件注冊表,插件粒度以及可用于插件連接的廣泛選擇都有助于實現此模式所涉及的復雜性。
4.微服務架構(Microservices Architecture Pattern)
微服務架構模式作為單體應用程序和面向服務的架構的可行替代方案,正在業界迅速獲得成功。 因為這種架構模式一直在發展,所以業界對這個模式是什么以及如何實現有很多困惑.本章節將向您提供了解這種重要架構模式的優點(和權衡)所必需的關鍵概念和基礎知識,以及它是否適合您的應用程序。
無論您選擇的拓撲結構或實現風格如何,都有一些常見的核心概念適用于一般的架構模式。 首先是單獨部署單元的概念。 如圖4-1所示,微服務架構的每個組件都作為一個單獨的單元部署,允許通過有效和簡化的交付管道更容易地部署,提高可擴展性,以及在應用程序中實現高度的應用程序和組件解耦。
從單體應用到微服務架構風格的演進路徑主要是通過開發持續交付,從開發到生產的連續部署的概念,這簡化了應用程序的部署.單體應用通常由多個緊密耦合的組件構成,這些組件是部署單元的一部分,這使得改變,測試和部署應用變得麻煩和困難(因此,大多數大型IT商店中常見的“每月部署”周期的興起 ). 這些因素通常導致脆弱的應用程序,每次部署新的東西時容易被破壞.微服務架構模式通過將應用程序分為多個可部署單元(服務組件)來解決這些問題,這些可單獨開發,測試和部署,而與其他服務組件無關。
理解這個模式最重要的概念是服務組件的概念。 相比考慮微服務架構中的服務,最好還是考慮服務組件,服務組件從單個模塊到大塊應用的粒度可能有所不同。 服務組件包含表示單一用途功能(例如,為特定城市或城鎮提供天氣)或大型商業應用的獨立部分(例如,股票交易放置或 確定汽車保險費率)。 設計正確級別的服務組件粒度是微服務架構中最大的挑戰之一。 此挑戰在以下服務組件編排子部分中有更詳細的討論。
微服務架構模式內的另一個關鍵概念是其是分布式架構,意味著架構內的所有組件彼此完全解耦并且通過某種遠程訪問協議(例如JMS,AMQP,REST,SOAP, RMI等)。 這種架構模式的分布式特性有助于實現其一些卓越的可擴展性和部署特性。
微服務架構的一個吸引人的地方在于它是從與其他通用架構模式相關的問題演變而成,而不是作為等待問題發生的解決方案來創建.微服務架構風格自然地從兩個主要來源演變而來:使用分層架構模式開發的單體應用程序和通過面向服務的架構模式開發的分布式應用程序.
從單體應用到微服務架構風格的演進路徑主要是通過開發持續交付,從開發到生產的連續部署管道的概念,這簡化了應用程序的部署。 單片應用通常包含緊密耦合的組件,使得改變包含改變,測試和部署應用變得麻煩和困難(因此,大多數大型IT商店中常見的“每月部署”周期的興起 )。 這些因素通常導致脆弱的應用程序,每次部署新的東西時都會產生風險。 微服務架構模式通過將應用程序分為多個可部署單元(服務組件)來解決這些問題,這些可單獨開發,測試和部署,而與其他服務組件無關。
導致微服務體系結構模式的另一個來源是來自實現面向服務的體系結構模式(SOA)的應用程序出現的問題.雖然SOA模式非常強大,提供了強大的抽象級別,異構連接,服務編排,以及將業務目標與IT功能對齊的承諾,但是它是復雜,昂貴,分散的,難以理解和實施的,而且對于大多數應用是過度的. 微服務架構風格通過簡化服務概念,消除編排需求以及簡化連接和訪問服務組件來解決這種復雜性。
模式拓撲(Pattern Topologies)
雖然有幾十種方法來實現微服務架構模式,但其中三個主要拓撲結構是最常見和最受歡迎的:基于API REST的拓撲(API REST-based),基于應用程序REST的拓撲(API REST-based)和集中式消息傳遞拓撲(centralized messaging)。
基于API REST的拓撲通過一些API(應用程序編程接口)暴露的較少,獨立的單獨服務,這對于一些網站是有用的。 此拓撲(如圖4-2所示)由非常細粒度的服務組件(因此稱為微服務)組成,其中包含一個或兩個模塊,這些模塊獨立于其他服務執行特定的業務功能。 在這種拓撲中,這些細粒度的服務組件通常使用通過單獨部署的基于web的API層實現的基于REST的接口來訪問。該拓撲的示例包括由Yahoo,Google和Amazon建立的單一職責的RESTful web服務.
應用程序基于REST的拓撲與基于API REST的方法不同的,它是通過傳統的基于Web或胖客戶端的業務應用程序界面接收客戶端請求,而不是通過簡單的API層. 如圖4-3所示,應用程序的用戶界面層被部署為單獨的Web應用程序,通過簡單的基于REST的接口遠程訪問單獨部署的服務組件(業務功能)。 此拓撲中的服務組件與基于API-REST的拓撲中的服務組件不同,這些服務組件往往更大,更粗略,并且代表整體業務應用程序的一小部分,而不是細粒度的單一服務 。 這種拓撲對于具有相對較低復雜度的小到中等規模的業務應用是常見的。
微服務架構模式中的另一種常見方法是集中式消息傳遞拓撲。 此拓撲(如圖4-4所示)類似于之前基于REST的應用程序拓撲,除了不使用REST進行遠程訪問,此拓撲使用輕量級集中式消息代理(例如ActiveMQ,HornetQ等).當查看此拓撲時,不要將其與面向服務的架構模式混淆或將其視為“SOA-Lite”,這是至關重要的.在此拓撲中找到的輕量級消息代理不會執行任何編排,轉換或復雜路由,它只是一個輕量級的傳輸來訪問遠程服務組件.
集中式消息拓撲適用于在需要對用戶接口和服務組件之間的傳輸層進行更復雜控制的更大的業務應用或應用.與先前討論的簡單的基于REST的拓撲相比,此拓撲的優點是高級排隊機制,異步消息傳遞,監視,錯誤處理以及更好的總體負載平衡和可擴展性。 通常通過代理群集和代理聯合(將單個代理實例分成多個代理實例,以根據系統的功能區域劃分消息吞吐量負載)來解決通常與集中式代理相關聯的單點故障和架構瓶頸問題。
避免依賴和編排(Avoid Dependencies and Orchestration)
微服務架構模式的主要挑戰之一是為服務組件確定正確的粒度級別。 如果服務組件過粗,您可能無法實現這種架構模式(部署,可擴展性,可測試性和松耦合)帶來的好處。 然而,過于細粒度的服務組件將導致服務編排的需求,這會將精簡的微服務架構轉變為重量級的面向服務的架構,并且會包含在SOA所特有的復雜性,混亂,昂貴和瑕疵.
如果您發現需要從應用程序的用戶界面層或API層中編排您的服務組件,那么您的服務組件可能太細粒度。 同樣,如果您發現需要在服務組件之間執行服務間通信來處理單個請求,則您的服務組件可能過于細粒度,或者從業務功能的角度來看,它們沒有正確分區.
可以通過共享數據庫來處理可能強制組件之間不期望的耦合的服務間通信。 例如,如果處理因特網訂單的服務組件需要客戶信息,則它可以去到數據庫以檢索必要的數據,而不是調用客戶 - 服務組件內的功能。
共享數據庫可以提供所需的信息,但是共享功能怎么辦? 如果服務組件需要包含在另一個服務組件中或所有服務組件都共用的功能,您有時可以跨服務組件復制共享功能(從而違反DRY原則:不要重復自己).在大多數實現微服務架構模式的業務應用程序中,這是相當常見的做法,為了保持服務組件獨立和分離其部署,需要將業務邏輯小部分的冗余.小型實用程序類可能屬于此類重復的代碼。
如果您發現無論服務組件粒度級別如何,您仍然無法避免服務組件編排,那么這是一個好的跡象,這可能不是您的應用程序的正確的架構模式.由于此模式的分布式特性,很難在服務組件之間(和之間)維護單個事務性工作單元. 這種做法將需要某種用于回滾事務的事務補償框架,這為這種相對簡單和優雅的架構模式增加了顯著的復雜性[事物不能跨組件來完成]。
注意事項(Considerations)
微服務架構模式解決了在單片應用程序以及面向服務的架構中發現的許多常見問題.由于主要應用程序組件被拆分成更小的,單獨部署的單元,使用微服務架構模式構建的應用程序通常更健壯,提供更好的可擴展性,并且可以更容易地支持連續傳遞。
這種模式的另一個優點是它提供了進行實時生產部署的能力,從而顯著減少對傳統的每月或周末“大爆炸”生產部署的需求。 由于更改通常與特定服務組件隔離,因此只需要部署需要更改的服務組件。 如果您只有一個服務組件的一個實例,您可以在用戶界面應用程序中編寫專門的代碼來檢測活動的熱部署,并將用戶重定向到錯誤頁面或等待頁面。 或者,您可以在實時部署期間交換服務組件的多個實例,從而在部署周期內實現連續可用性(這對于分層架構模式非常困難)。
要考慮的最后一個考慮因素是,由于微服務架構模式是分布式架構,它分享了在事件驅動架構模式中發現的一些相同的復雜問題,包括契約創建,維護和治理,遠程系統可用性, 遠程訪問認證和授權。
模式分析(Pattern Analysis)
該章節包含常見架構特性的評級和分析。 每個特性的評級基于自然趨勢或該特性作為基于圖案的典型實施的能力,以及通常已知的圖案。 對于此模式與本報告中其他模式如何相關的并行比較,請參見本報告末尾的附錄A.
靈活性(Overall agility)
- 級別:高
- 分析:總體靈活性是對不斷變化的環境做出快速反應的能力.由于單獨部署的單元這個特點,改變通常被隔離到單獨的服務組件,這允許快速和容易的部署。此外,使用這種模式的應用建立趨于非常松散耦合,這也有助于促進改變。
可部署性(Ease of deployment)
- 級別:高
- 分析:總體上,由于事件處理器組件的去耦特性,這種模式相對容易部署.代理拓撲趨向于比中介器拓撲更容易部署,主要是因為事件中介器組件在某種程度上緊密耦合到事件處理器:事件處理器組件的變化也可能需要事件中介器的改變, 被部署為任何給定的變化。
可測試性(Testability)
- 級別:高
- 分析:由于將業務功能分離和隔離為獨立應用程序,因此可以對測試進行限定,從而實現更有針對性的測試工作。 特定服務組件的回歸測試比整個單片應用程序的回歸測試容易得多且更可行。此外,由于此模式中的服務組件松散耦合,因此從進行變更的開發角度看的很少能夠影響應用程序的另一部分,減輕了測試整個應用程序的一個小的變化的測試負擔。
性能(Performance)
- 級別:低
- 分析:雖然您可以創此模式實現的應用程序執行非常好,但由于微服務架構模式的分布式特性,這種模式本身并不適合高性能應用程序。
可擴展性(Scalability)
- 級別:高
- 分析:由于應用程序分為單獨部署的單元,每個服務組件可以單獨縮放,允許對應用程序進行微調縮放. 例如,由于該功能的低用戶量,股票交易應用的管理區域可能不需要縮放,但是交易布置組件需要包含縮放功能,由于大多數交易應用為此所需的高吞吐量.
開發容易度(Ease of development)
- 級別:高
- 分析:由于功能被隔離到單獨的和不同的服務組件中,由于較小和隔離的范圍,開發變得更容易. 開發人員對一個服務組件進行更改會影響其他服務組件的機會少得多,從而減少了開發人員或開發團隊之間的協調。
5.云架構(Space-Based Architecture)
大多數基于Web的業務應用程序都遵循相同的一般請求流:一個來自瀏覽器的請求發送至Web服務器,然后是應用程序服務,最后是數據庫服務.雖然此模式對于一小部分用戶非常有用,但是隨著用戶負載的增加,瓶頸開始首先出現在Web服務器層,然后在應用程序服務器層,最后在數據庫服務器層。基于用戶負載增加的瓶頸的應對方案通常是是向外擴展web服務器.這是相對容易和便宜的,通常能順利解決問題.但是,在大多數用戶負載較高的情況下,擴展Web服務器層只是將瓶頸移動到應用程序服務器.縮放應用程序服務器可能比Web服務器更復雜和昂貴,通常只是將瓶頸移動到數據庫服務器,這是更加困難和昂貴的擴展。即使你可以擴展數據庫,你最終得到的是一個三角形拓撲(triangleshaped),三角形的最寬部分是Web服務器(最容易擴展),最小的部分是數據庫(最難以擴展).
在任何具有極大并發用戶負載的大容量應用程序中,數據庫能夠同時處理多少事務是最終限制因素.雖然各種緩存技術和數據庫擴展產品有助于解決這些問題,但事實仍然是,擴展正常應用程序解決極端負載問題是一個非常困難的命題.
基于云的架構模式專門設計用于處理和解決可擴展性和并發性問題.對于具有可變和不可預測的并發用戶卷的應用程序,它也是一種有用的體系結構模式.在架構上解決極端和可變的可伸縮性問題通常是比將數據庫擴展或將緩存技術改進更好。
模式描述(Pattern Description)
基于空間的模式(有時也稱為云架構模式)將限制應用程序縮放的因素將至最低. 這個模式顧名思義,來源于從元組空間( tuple space)的概念和分布式共享內存的概念得。 通過去掉中央數據庫約束并使用復制的內存數據網格實現高可擴展性。 應用數據保存在內存中并在所有活動處理單元之間復制.當用戶負載增加和減少時,處理單元可以動態地啟動和關閉,從而解決可變的可擴展性。 因為沒有中央數據庫,所以去掉了數據庫瓶頸,在應用程序中提供了近乎無限的可擴展性.
大多數符合此模式的應用程序是從瀏覽器接收請求并執行某種操作的標準網站. 招標拍賣網站就是一個很好的例子. 該網站通過瀏覽器請求不斷接收互聯網用戶的出價. 應用程序將接收對特定項目的出價,記錄具有時間戳的出價,并且更新項目的最新出價信息,并將信息發送回瀏覽器。
此架構模式中有兩個主要組件:處理單元(processing unit)和虛擬中間件(virtualized middleware). 圖5-1說明了基本的基于空間的架構模式及其主要架構組件。
處理單元組件包含應用組件(或應用組件的部分). 這包括基于web的組件以及后端業務邏輯.處理單元的內容基于應用的類型而變化 - 較小的基于web的應用可能被部署到單個處理單元中,而較大的應用可基于應用的功能區域將應用功能分割成多個處理單元。 處理單元通常包含應用程序模塊,以及內存中數據網格和可選的異步持久存儲器,防止異常丟失數據. 它還包含復制引擎,虛擬化中間件使用復制引擎將一個處理單元所做的數據更改復制到其他活動處理單元。
虛擬化中間件組件處理管理和通信.它包含控制數據同步和請求處理的各個方面的組件.虛擬化中間件中包含消息傳遞網格,數據網格,處理網格和部署管理器. 這些組件在下一節中有詳細描述,可以定制或作為第三方產品購買。
Pattern Dynamics
基于空間的架構模式的魔力在于虛擬化的中間件組件和包含在每個處理單元內的內存數據網格.圖5-2顯示了典型的處理單元架構,包含應用程序模塊,內存數據網格,用于故障轉移的可選異步持久存儲以及數據復制引擎.
虛擬化中間件本質上是架構的控制器,并且管理請求,會話,數據復制,分布式請求處理和過程單元部署.在虛擬化中間件中有四個主要的架構組件:消息傳遞網格,數據網格,處理網格和部署管理器.
消息網格(Messaging Grid)
消息網格(如圖5-3所示)管理輸入請求和會話信息。 當一個請求進入虛擬化中間件組件時,消息傳遞網格組件確定哪些活動處理組件可用于接收請求,并將請求轉發到這些處理單元之一.消息網格的復雜性可以從簡單的循環算法到更復雜的 臨近可用算法(next-available algorithm),保持跟蹤由哪個處理單元處理哪個請求。
數據網絡(Data Grid)
數據網格組件可能是這種模式中最重要和最重要的組件. 數據網格利用每個處理單元中的數據復制引擎,當數據更新發生時,管理單元之間的數據復制. 由于消息傳送網格可以向任何可用的處理單元轉發請求,因此每個處理單元在其內存數據網格中包含完全相同的數據是必要的. 雖然圖5-4顯示了處理單元之間的同步數據復制,但實際上這是以異步和非常快速的并行方式完成的,有時在幾微秒(百萬分之一秒)內完成數據同步.
處理網格(Processing Grid)
如圖5-5所示,處理網格是虛擬化中間件中的一個可選組件,當存在多個處理單元(每個單元處理應用程序的一部分)時管理分布式請求處理.如果進入需要處理單元類型(例如,訂單處理單元和客戶處理單元)之間的協調的請求,則是在這兩個處理單元之間中介和協調請求的處理網格。
部署管理(Deployment Manager)
部署管理器組件根據負載條件管理處理單元的動態啟動和關閉.該組件持續監視響應時間和用戶負載,并在負載增加時啟動新的處理單元,并在負載減少時關閉處理單元.它是在應用程序中實現可變可擴展性需求的關鍵組件.
注意事項(Considerations)
基于云架構模式是一個實現復雜和昂貴的模式. 對于具有可變負載且規模較小的基于網絡的應用(例如,社交媒體網站,競價和拍賣網站),這是一種良好的架構選擇。 然而,它不太適合具有大量操作數據的傳統大規模關系數據庫應用程序。
盡管基于空間的架構模式不需要集中式數據存儲,但是需要用于執行初始內存數據網格加載和異步保持由處理單元進行的數據更新。 常見的做法是創建將易失性和廣泛使用的事務數據與非活動數據隔離的單獨分區,以便減少每個處理單元內的內存數據網格的存儲器占用。
需要著重注意的是,雖然這種模式的替代名稱是基于云的架構,但是處理單元(以及虛擬化中間件)不一定要駐留在基于云的托管服務或PaaS(平臺即服務)上, 它可以很容易駐留在本地服務器上,這是我更喜歡名為“基于空間的架構”的原因之一。
從產品實現的角度來看,您可以通過第三方產品(如GemFire,JavaSpaces,GigaSpaces,IBM Object Grid,nCache和Oracle Coherence)實現此模式中的許多架構組件.由于此模式的實施在成本和功能(特別是數據復制時間)方面有很大差異,因此作為架構師,您應首先確定具體目標和需求,然后再進行任何產品選擇.
模式分析(Pattern Analysis)
該章節包含事件驅動架構模式的常見架構特性的評級和分析。 每個特性的評級基于自然趨勢或該特性作為基于圖案的典型實施的能力,以及通常已知的圖案。 對于此模式與本報告中其他模式如何相關的并行比較,請參見本報告末尾的附錄A.
靈活性(Overall agility)
- 級別:高
- 分析:總體靈活性是對不斷變化的環境做出快速反應的能力.因為處理單元(應用的所部署的實例)可以快速進行調整,所以應用對于與用戶負載(環境變化)的變化能夠很好的地響應.使用該模式創建的結構通常對由于應用程序的大小和模式的動態特性。
可部署性(Ease of deployment)
- 級別:高
- 分析:雖然基于空間的架構通常不是解耦和分布式的,但它們是動態的,復雜的基于云的工具允許應用程序輕松地“推送”到服務器,簡化部署。
可測試性(Testability)
- 級別:低
- 分析:在測試環境中實現非常高的用戶負載既昂貴又耗時,使得難以測試應用的可擴展性方面。
性能(Performance)
- 級別:高
- 分析:通過內存數據訪問和緩存機制構建到此模式中來實現高性能。
可擴展性(Scalability)
- 級別:高
- 分析:高可擴展性來自于對集中式數據庫的依賴很少或沒有依賴性,因此基本上從可擴展性方程中去除了這個限制性瓶頸。
開發容易度(Ease of development)
- 級別:低
- 分析:復雜的緩存和內存數據網格產品使得這種模式開發起來相對復雜,主要是因為缺乏對用于創建這種類型的架構的工具和產品的熟悉.此外,在開發這些類型的體系結構時必須特別小心,以確保源代碼中不會影響性能和可伸縮性