領域事件與事件溯源

  事件代表過去發生的事件,事件既是技術架構概念,也是業務概念。以事件為驅動的編程模型稱為事件驅動架構EDA。

  一個事件代表某個已經發生的事情,在計算機系統中,事件是由一個對象表達,其包含有關事件的數據,比如發生的時間,地點等等。這個事件對象可以存在在一個消息或數據庫記錄或其他組件的形式中,這樣一個對象稱為"一個事件"。事件本身是不可變的值對象。  

  事件在技術架構上應用能提供無堵塞的高并發性能,如Nginx和Node.js,而Vert.x. 比 Node.js快好幾倍?其他還有Event Stream Processing如Esper等,結合DDD實現的CQRS等。

  事件概念業務系統中應用,誕生領域事件和EventSourcing等DDD實現方式:通過引入事件,類似服務概念一樣,跨越業務和技術鴻溝,同時又能表達面向函數編程思維。在業務上將事件和領域驅動設計DDD結合在一起,可以形成統一語言DSL,事件是觸發狀態變化的根源。

  領域事件是領域中發生的事件。如CustomerRelocated, CargoShipped, or InventoryLossageRecorded. 領域事件將領域模型的改變顯式化,突出暴露出來。如下圖:

領域事件

 

事務日志

  幾乎所有數據庫都支持高可用性集群,大多數數據庫對系統一致性模型提供一個易于理解的方式,保證強一致性模型的安全方式是維持數據庫事務操作的有序日志,理論上理由非常簡單,一個事務日志是一系列數據更新操作的動作有序記錄集合,當其他節點從主節點獲得這個事務日志時,能夠按照這種有序動作集合重新播放這些操作,從而更新自己所在節點的數據庫狀態,當這個事務日志完成后,次節點的狀態最終會和主節點狀態一致,

  這種事務日志非常類似于財務中記賬模型,或者類似銀行儲蓄卡打印出來的流水賬,哪天存入一筆鈔票(更新操作),哪天又提取了一筆鈔票(更新操作),最后當前余額是多少(代表數據庫當前狀態)。

  

Event Sourcing

  Event sourcing事件溯源是借鑒數據庫事務日志的一種數據持久方式,在事務日志中記錄導致狀態變化的一系列領域事件。通過持久化記錄改變狀態的事件,通過重新播放獲得狀態改變的歷史。 事件回放可以返回系統到任何狀態。

  在ES中,事務單元變得更細粒度,使用一系列有序的事件來代表存儲在數據庫中的領域模型狀態,一旦一個事件被加入事件日志,它就不能被移走或重新排序,事件被認為是不可變的,事件序列只能被追加方式存儲。

 

  由于事件流本身具有邏輯上嚴格次序性,因此使用統一的事件流(事務日志)能夠很自然實現事務機制,無需額外ACID機制或2PC之類同步強硬方式。

 

函數式編程

  在微服務等無狀態應用架構中,我們不是需要狀態時就發出命令從數據庫中查詢獲得,這樣,可變的狀態會遍布整個應用代碼中,帶來很多副作用,而我們將這些狀態操作統一為事件流聲明式訂閱,訂閱了某個事件流,通過重播事件流中各個事件一直到最新最后的事件,也就獲得了最終的狀態。函數式編程Stream風格為這種播放提供了方便,具體Reactive框架有RxJS、React.js、RxJava、Reactor等等。

Spring Cloud Stream實戰

  這種實現其實已經在Reactive前端中有著同樣實現思路,見:為什么要使用GraphQL和Falcor?,應用程序(微服務)將可變的狀態被限定在一個單個的序列化對象中,從而整個應用就變成了無態,可變狀態不會擴散到整個應用代碼的各個本地變量中。

 

事件建模

  我們甚至可以使用領域事件直接對業務需求進行事件建模,通過事件功能的發現挖掘需求中深層次的概念。動態流的事件模型加上結合DDD的聚合實體 狀態 和上下文場景Bounded context,我們實際上統一了需求分析和軟件設計兩個階段的語言,使用這套統一語言分析需求以后,能夠直接落地為代碼,如下圖是總結了在Jdon多位牛人的思想后的Jdon分析法:

event

  該圖表達了用戶操作者和被操作者事物之間的本質關系,以用戶和購物車為案例,從購物車這個事物角度看:領域聚合實體表達的是購物車這個事物的分析設計方法,以一種靜態結構性來表達事物;從用戶購買者這個角度看:用戶將選購的商品放入購物車,刪除購物車已有商品,這些都是用戶的操作行為,每一個操作行為相當于發出一個個命令command,在一定場景中轉化為事件,事件會改變購物車狀態,這是一種以動態行為(面向函數)來表達與人有關的需求。

  事件建模原理,找出意圖 執行和結果范式:

  對應意圖 執行和結果范式的事件風暴圖:

區塊鏈

   通過引入事件概念,可以實現多線程并發到分布式去中心化計算的平滑過渡,區塊鏈本質上就是一種事件鏈。 通常區塊鏈是指一種分布式賬簿,賬本其實是記賬明細,記錄著每筆進出明細,這些發生的每筆明細其實代表系統發生的事件,因此,記賬明細其實就是事件日志,區塊鏈其實就是一種分布式事件鏈,只不過另外增加了一層安全層。

   從CRUD編程切換到事件溯源和區塊鏈編程

 

工作流

   事件是BPMN流程建模元素,表示在流程過程中“發生”的事情,事件會影響流程的走向,事件主要分開始事件、中間事件和結束事件,所謂中間事件就是位于開始和結束之間的事件類型。什么是BPMN事件?

   DDD、領域事件和BPMN流程和Saga可以有機結合在一起:

Jdon框架正在逐步實現上述思想,期待你共同參與。

相關文章

建模風暴(使用領域事件作為用戶故事的建模案例)

事件風暴將掀起一場新革命

事件模型-下一個前沿

什么是事件驅動架構EDA?

BPMN開始結束事件的最佳實踐

Jdon分析法

領域模型的行為設計

日志是每個軟件工程師關心的統一數據抽象

通過實體快照實現事件建模

為什么使用Event Sourcing?

面向事件數據庫Event Oriented Databases: 一種新的持久范式

Apache Kafka簡單介紹

依賴注入與事件編程

事件驅動編程

Go Reactive宣言

Go 1.5的并發特性與案例(事件與轉賬)

使用Apache Samza對數據庫進行徹底的"調教"

Lagom是一個集成ES/CQRS的Reactive微服務框架

比特幣區塊鏈是一種分布式的事件流日志

微服務的最終一致性與事件流

使用Spring Cloud和Reactor在微服務中實現EventSourcing

Twitter的分布式日志DistributedLog

如何理解Stream processing, Event sourcing, Reactive, CEP?

業務流程的新實現:微服務和事件編排

通過事件風暴和DDD建立微服務時優先考慮事件

事件風暴將掀起一場新革命

兩個領域事件驅動的開源項目介紹

如何設計實現真正的響應式微服務系統?

事件是一等公民

比特幣區塊鏈是一種分布式的事件流日志

從微服務到工作流:Jet訂單系統演變過程分享

最全面的CQRS和事件溯源介紹

經驗分享:采用事件溯源的誤區(以及我們是如何避免的)

分布式事務的替換者:在線事件處理OLEP(事件溯源)

 

相關話題

#領域事件 #工作流專題 #Saga流程管理器 #Event Sourcing

#Reactive專題 #CQRS專題 #Actor模型 #異步編程

#EDA專題 #無服務器架構 #分布式事務 #業務與系統分析

一级黄色录像影片 夫妻性生活影片 免费在线观看 一级a做爰片