1. 程式人生 > >ENode 2.6 架構與設計簡介以及全新案例分享

ENode 2.6 架構與設計簡介以及全新案例分享

前言

ENode是一個應用開發框架,為開發人員提供了一整套基於DDD+CQRS+ES+EDA架構風格的解決方案。ENode從釋出1.0開始到現在的差不多兩年時間,我幾乎每週都在更新設計或實現程式碼。以至於從來沒有一個穩定的版本可以提供給大家,非常慚愧。但我相信,隨著時間的推移和我的努力的積累,ENode一定會越來越穩定和成熟的。我覺得我此刻很幸福,因為我有自己的興趣且有機會在業餘時間為了自己的興趣而奮鬥。

今天是個開心的日子,因為我終於使用ENode開發出了一個比較有說服力的真實案例,一個線上會議位置管理與訂購系統。該案例與微軟的Microfost CQRS Journey案例的功能一致,只是是用ENode開發完成的。目的是為了展示:

  1. 如何使用ENode支援DDD領域層的實現;
  2. 如何使用ENode實現CQRS+ES的架構;
  3. 如何使用ENode實現事件驅動的架構(EDA);

另外,在案例開發過程中,也不斷髮現了ENode, EQueue的很多問題。所以,通過做這個案例,也幫助ENode, EQueue完善了很多。真是要實踐才能進步啊!

ENode架構簡介

ENode目前的架構已經和最初的1.0版本有較大的差別了。比如,沒有了對Redis的依賴,增加了Command Store的設計。最新版本的ENode架構圖如下:

熟悉CQRS架構的人應該對這個圖不太陌生。需要強調的有兩點:

  1. 新版的架構圖中,Domain Aggregate是常駐記憶體的;聚合根的職責就是封裝狀態、業務規則,同時產生領域事件;
  2. 新增了一個Command Store,用於實現Command的冪等處理;

關於圖中的其他部分的介紹,請參看我之前寫的關於ENode系列的文章。 

ENode關鍵特性

  1. 實現了CQRS架構,支援分散式,基於佇列的水平擴充套件,框架設計之初就考慮了架構的各個節點的水平擴充套件;
  2. 面向高併發設計;架構層面,充分考慮到了如何解決併發問題;通過用EQueue實現伺服器之間的訊息路由、通過單機內部實現類似Actor Mailbox的設計,從而避免併發的產生。提高CQRS架構C端的整體寫入吞吐量;即便在某些極端情況下出現併發問題,也支援自動的樂觀檢測,並自動重試;另外,架構層面,規定一個command只能涉及一個聚合根的修改,從而規範應用開發者必須嚴格按照訊息驅動的思路來實現複雜的業務流程,而不能使用工作單元的方式,以事務的方式實現資料的強一致性;

  3. 嚴謹的訊息冪等處理支援;由於ENode是訊息驅動的架構,所以對訊息的冪等性處理,是框架關注的一個重要的方面,並在架構層面做了支援。這使得應用開發人員不必擔心訊息的重複處理帶來的問題。
  4. Domain Aggregate常駐記憶體;這個設計可以提高C端command的處理效能。因為我們不必像傳統的方式那樣先把聚合根從db取出來,再修改,再儲存回去了;
  5. 框架為開發人員展示瞭如何更好的實現Sagas,在CQRS架構中,Sagas指基於訊息驅動的業務流程;一個Saga包含若干個聚合根以及一個(通常)流程管理器(Process Manager);聚合根維護流程中的所有參與者物件的狀態以及流程本身的狀態,流程管理器負責定義和實現流程控制邏輯,無狀態;流程管理器的實現是通過響應事件、異常、應用層訊息,然後傳送相應的命令,從而實現訊息驅動的流程;
  6. 採用Event Sourcing(簡稱ES)的方式來持久化聚合根狀態;通過ES實現聚合根狀態的還原以及通用的併發控制,通過聚合根ID+事件版本號作為唯一索引的思路實現樂觀併發控制;
  7. 訊息除了command, domain event外,還支援exception message, application message;這兩種訊息是我們在遇到有些訊息不適合用domain event來表達時需要使用到;比如聚合裡有時我們要修改某個狀態前會先做業務規則的檢查判斷,如果不合法,通常會拋異常,然後這個異常我們又希望可以讓流程管理器知道,從而流程管理器可以做後面的回滾或補償措施;另外,我們有時可能會在應用層面(command handler裡)和其他外部系統發生互動,那互動的結果,使用應用層的訊息更合理;ENode在架構層面,對上面這些訊息做了統一的支援;
  8. 框架提供返回單個command執行結果以及阻塞等待command執行結果的支援,這個對於開發者希望同步執行command並知道command執行結果的時候,非常有幫助;這樣開發者就不用自己去輪訓了。
  9. 除了對訊息的冪等處理的支援外,ENode對domain event的順序處理,也做了充分的考慮和支援,確保當C端產生的domain event同步到Q端時,Q端處理時,框架層面能確保Q端的處理順序不會亂序。從而保證C,Q兩端的資料是最終一致的;
  10. 保證訊息能至少被處理一次;主要思路是確保訊息的:1)持久化;2)訊息ACK後才認為已消費;
  11. 支援一個聚合根一次可以產生多個domain event;雖然大部分情況,一個聚合根一次只會產生一個domain event,但有些場景,可能會產生兩個或多個。此時,這些事件會以一個事件流的方式一起apply到當前聚合根;同時,在Q端,框架也會通過必要的手段,與使用者程式碼一起保證了事件流中的事件的處理順序的正確性;
  12. ENode所使用的分散式訊息佇列EQueue,參考了阿里的RocketMQ的架構思想,具有高效能、可擴充套件、輕量級的特性,支援不受限於機器記憶體大小的訊息堆積能力,而且是純C#開發。同時還提供了簡單實用的管理控制檯,可以讓我們輕鬆的管理訊息佇列。比如可以方便的動態增加、禁用、啟用、刪除佇列,查詢訊息內容、訊息消費進度,等資訊;目前,EQueue也已經經過多個迭代,並且已經有真實使用者進行使用,功能基本趨於成熟穩定。

Conference案例簡介

Conference是一個微軟開發的,基於DDD+CQRS+ES的一個開源專案。專案主頁:cqrsjourney.github.io

這個專案,對我們大家學習DDD領域驅動設計、CQRS+ES的架構,非常有幫助。

  • 該案例從業務上,實現了一個典型的電子商務系統的關鍵環節:商品管理、庫存管理、下單、減庫存、支付;
  • 該案例從技術上,很好的展示了CQRS架構的優點。比如可以在Q端定製不同的檢視,以應對不同的查詢需求;
  • 該案例很好的向我們展示瞭如何劃分領域,劃分邊界上下文(bounded context),並如何使用不同的架構技術,實現不同的上下文,非常具有學習價值。

正是因為這個專案的以上優點,讓我有興趣使用ENode作為技術支撐,實現同樣功能的系統。在重寫的過程中,保留了所有非技術的東西,比如邊界上下文的劃分、領域層等;所有技術相關的部分,用ENode替代。

希望有興趣的同學,可以去下載原始碼進行研究。瞭解ENode,最快的方法就是從案例程式碼開始。如果想進行交流,可以加QQ群:185916873,隨時歡迎有興趣的道友加入。

最後,貼一個Conference案例中訂單處理的Sagas流程圖:

不早了,實在寫不下去了,就到這吧。

相關推薦

ENode 2.6 架構設計簡介以及全新案例分享

前言 ENode是一個應用開發框架,為開發人員提供了一整套基於DDD+CQRS+ES+EDA架構風格的解決方案。ENode從釋出1.0開始到現在的差不多兩年時間,我幾乎每週都在更新設計或實現程式碼。以至於從來沒有一個穩定的版本可以提供給大家,非常慚愧。但我相信,隨著時間的推移和我的努力的積累,ENode一定

Tomcat 系統架構設計模式,第 2 部分: 設計模式分析

門面設計模式在 Tomcat 中有多處使用,在 Request 和 Response 物件封裝中、Standard Wrapper 到 ServletConfig 封裝中、ApplicationContext 到 ServletContext 封裝中等都用到了這種設計模式

Skype for Business邊緣架構設計課程筆記

business skype 文章 課程 文章鏈接:http://yangqs.com/?p=26 本文出自 “強生的博客” 博客,請務必保留此出處http://yangqs.blog.51cto.com/127876/1934724Skype for Business邊緣架構與設計課程筆記

第11章 Tomcat的系統架構設計模式

必須 ket 聲明 命令模式 基本 ner 虛擬主機 fec 啟動 11.1 Tomcat總體設計   11.1.1 Tomcat總體架構   Tomcat和核心有連個組件:Connector和Container,Connector是可以被替換的。一個container可以

TensorFlow架構設計:概述

運行 建立 不同的 bsp 通用 折疊 客戶 gpu 通信 TensorFlow是什麽? TensorFlow基於數據流圖,用於大規模分布式數值計算的開源框架。節點表示某種抽象的計算,邊表示節點之間相互聯系的張量。 TensorFlow支持各種異構的平臺,支持多CPU/G

2.泡妞設計模式(三) 外觀模式

col 多個 style div AC 自己 box 有一個 int FACADE 門面(外觀)模式 門面模式:外部與一個子系統的通信必須通過一個統一的門面對象進行。門面模式提供一個高層次的接口,使得子系統更易於使用。每一個子系統只有一個門面類,而且此門面類只有一個實例,也

數據倉庫的架構設計

數據平臺 text 消息 dimen 建立 合作 安裝 OS nosql數據庫 公司之前的數據都是直接傳到Hdfs上進行操作,沒有一個數據倉庫,趁著最近空出幾臺服務器,搭了個簡陋的數據倉庫,這裏記錄一下數據倉庫的一些知識。涉及的主要內容有: 什麽是數據倉庫? 數據倉庫的架

Java開源生鮮電商平臺-Java後端生成Token架構設計詳解(源碼可下載)

red 基於 一次 frame service state dha 概述 class Java開源生鮮電商平臺-Java後端生成Token架構與設計詳解(源碼可下載) 目的:Java開源生鮮電商平臺-Java後端生成Token目的是為了用於校驗客戶端,防止重復提交. 技

centos7 + ambari 2.6安裝系統配置過程記錄

繼上一篇部落格記錄如何u盤安裝centos,centos7 u盤安裝遇到的坑以及靠譜解決方法,繼續寫安裝的ambari的過程。 安裝的過程主要是參考這個部落格的,CentOS 7.4 安裝 Ambari 2.6.0 + HDP 2.6.3 搭建Hadoop叢集 在安裝過程出現了很多配置相關問題,

dubbo monitor 2.6 安裝搭建

Dubbo 原始碼:https://github.com/apache/incubator-dubbo/ Dubbo 版本歷史:https://github.com/apache/incubator-dubbo/releases 首先提供dubbo-monitor-2.6 服務下載連結:http

dubbo admin 2.6 安裝搭建 - 待續

搭建dubbo-admin平臺 Dubbo 在2.6版本時合併了dubbox 的分支,現在dubbo-admin也遷移到一個單獨專案。 Dubbo 原始碼:https://github.com/apache/incubator-dubbo/ Dubbo 版本歷史:https://github.

《深入分析JavaWeb技術內幕》之 12-Spring架構設計模式

    core context bean(bean工廠,bean定義,bean解析)   bean(bean工廠,bean定義,bean解析)     

《深入分析JavaWeb技術內幕》之 11-Tomcat系統架構設計模式

1、 分發請求 2 、同時請求 3、 多級容器 4、 設計模式 Tomcat的組織結構 https://www.cnblogs.com/zhouyuqin/p/5143121.html   Tomcat Server處理一個HTTP請求的

5資料倉庫的架構設計

公司之前的資料都是直接傳到Hdfs上進行操作,沒有一個數據倉庫,趁著最近空出幾臺伺服器,搭了個簡陋的資料倉庫,這裡記錄一下資料倉庫的一些知識。涉及的主要內容有: 什麼是資料倉庫? 資料倉庫的架構 資料倉庫多維資料模型的設計 1. 什麼是資料倉庫 1.1 資料倉庫的概念 官方定義 資料倉庫是一

Spring REST Docs 1.2.6.RELEASE 2.0.3.RELEASE 釋出

   Spring REST Docs 1.2.6.RELEASE 與 2.0.3.RELEASE 釋出了,Spring REST Docs 是 RESTful 服務的測試驅動文件,使用 Asciidoctor 手工編寫內容結合使用 Spring MVC Test 框架自動生成

電商平臺-Java後端生成Token架構設計詳解

目的:Java開源生鮮電商平臺-Java後端生成Token目的是為了用於校驗客戶端,防止重複提交. 技術選型:用開源的JWT架構。   1.概述:在web專案中,服務端和前端經常需要互動資料,有的時候由於網路相應慢,客戶端在提交某些敏感資料(比如按照正常的業務邏輯,此份資料只能儲存一

Spring原始碼解析--《SPRING技術內幕:深入解析Spring架構設計原理》讀書筆記(一):IOC容器初始化過程

通過閱讀相關章節內容,Spring中IOC容器的載入中,我們需要了解下列幾個概念: Resource:是一個定位、訪問資源的抽象介面,包含了多種資源操作的基礎方法定義,如getInputStream()、exists()、isOpen()、getD

超級賬本Fabric的架構設計

超級賬本Fabric專案自誕生之日起就吸引了全球眾多企業的密切關注,已經先後釋出了兩個大的版本,0.6實驗版本(2016年9月)和1.0正式版本(2017年7月)。 目前,超級賬本Fabric架構上核心特性主要包括: 解耦了原子排序環節與其他複雜處理環節,

Tomcat 系統架構設計模式,第 1 部分: 工作原理

本文以 Tomcat 5 為基礎,也兼顧最新的 Tomcat 6 和 Tomcat 4。Tomcat 的基本設計思路和架構是具有一定連續性的。 Tomcat 的結構很複雜,但是 Tomcat 也非常的模組化,找到了 Tomcat 最核心的模組,您就抓住了 Tomcat 的“七寸”。下面是 Tomcat 的

6-Python設計模式--裝飾器模式

一、快餐點餐系統 又提到了那個快餐點餐系統,不過今天我們只以其中的一個類作為主角:飲料類。首先,回憶下飲料類: class Beverage(): name = "" price = 0.0 type = "BEVERAGE" def getPrice