使用AsyncAPI規範簡潔實現CQRS事件溯源案例

banq發表於2021-06-18

事件溯源從業者使用事件捕獲方法(如事件風暴和事件建模)設計他們的領域。這項工作的輸出通常是真實或數字白板上的大量便利貼。從這個模型中,開發人員必須填寫很多關於命令、事件和讀取模型的細節來構建一個工作系統。這個對映過程是手動的,發生在他們的腦海中。人工檢查和測試套件可確保程式碼與即時貼匹配。這個過程並不理想,因為實際系統可能不是事件模型所期望的。

AsyncAPI 規範讓我們有機會通過建立一個對映到事件模型的易於閱讀的文件來建立設計優先的 CQRS 系統,該系統簡潔地對映到事件建模域。本文件填寫每個命令、事件和讀取模型的資料詳細資訊。由於審閱者將單個 YAML 文件與便籤進行比較,因此驗證要簡單得多。

根據此規範,專案生成了一個可執行的事件驅動平臺框架,開發人員將業務邏輯和整合填充到事件儲存系統、投影儲存系統和事件模型中要求的其他系統。

這個專案就是這種方法的一個例子。它不是一個完整的實現,只展示了模型的幾個部分,足以展示如何使用 AsyncAPI 規範來構建一個事件驅動的 CQRS/ES 應用程式。

 

酒店Hotel是 CQRS 和事件溯源培訓材料中的常見示例域。事件建模網站有一個很好的酒店示例可供研究,這個專案鬆散地基於它的工件。

安裝

  1. 安裝最新的Node 執行時。本文件假設讀者使用的是 JavaScript,但生成器支援除 JS 之外的其他語言。
  2. 該專案使用 AsyncAPI 專案的生成器工具從 AsyncAPI 規範生成伺服器框架。在終端中,執行 npm install
  3. 工具安裝完成後,您可以生成程式碼框架:在終端中,執行 npm run generate
  4. 這將在output/資料夾中建立一個專案。

要審查的第一個檔案是hotels.yaml規範。它包含一些命令和事件的定義。AsyncAPI 呼叫這些“通道”,它們的定義與普通主題名稱一樣。我使用命名約定將相關頻道組合在一起。

  • 命令和事件

{entity}/commands/{command-name}
{entity}/events/{event-name}

該約定按命令和事件影響並代表其狀態的實體對命令和事件進行分組。

  1. 來賓/命令/註冊
  2. 客人/活動/註冊
  3. 酒店/命令/預訂客人
  4. 酒店/活動/客人預訂

命令和事件共享在headers欄位中儲存後設資料的基本架構。此欄位包含相關性 ID、參與者、時間戳以及您希望跨所有命令和事件型別跟蹤的任何後設資料等內容。這個稱為 的模式位於規範檔案shared-headers的components部分中。

  • 檢視(又名讀取模型)

views/{view-name}/{view-id}

檢視是事件的聚合,通常來自不同的實體。每個檢視例項都有自己的通道例項。這個專案有一個單一的檢視定義:

  1. 瀏覽量/酒店預訂/{hotelId}

  • 生成的程式碼

您可以在output目錄中找到生成的程式碼。這個目錄是一個節點專案,所以要開始,安裝依賴項

在終端中,執行 npm install

安裝完成後,您可以啟動生成的伺服器:

npm start

您將看到描述可用通道。

使用AsyncAPI規範簡潔實現CQRS事件溯源案例

SUB 表示處理程式正在偵聽通道名稱。PUB 意味著處理程式已準備好釋出訊息。這些處理程式的原始碼都在output/src/api/handlers/,專案中的其餘程式碼是使 API 栩栩如生所需的所有連線。

 

相關文章