使用AsyncAPI規範簡潔實現CQRS事件溯源案例
事件溯源從業者使用事件捕獲方法(如事件風暴和事件建模)設計他們的領域。這項工作的輸出通常是真實或數字白板上的大量便利貼。從這個模型中,開發人員必須填寫很多關於命令、事件和讀取模型的細節來構建一個工作系統。這個對映過程是手動的,發生在他們的腦海中。人工檢查和測試套件可確保程式碼與即時貼匹配。這個過程並不理想,因為實際系統可能不是事件模型所期望的。
AsyncAPI 規範讓我們有機會透過建立一個對映到事件模型的易於閱讀的文件來建立設計優先的 CQRS 系統,該系統簡潔地對映到事件建模域。本文件填寫每個命令、事件和讀取模型的資料詳細資訊。由於審閱者將單個 YAML 文件與便籤進行比較,因此驗證要簡單得多。
根據此規範,專案生成了一個可執行的事件驅動平臺框架,開發人員將業務邏輯和整合填充到事件儲存系統、投影儲存系統和事件模型中要求的其他系統。
這個專案就是這種方法的一個例子。它不是一個完整的實現,只展示了模型的幾個部分,足以展示如何使用 AsyncAPI 規範來構建一個事件驅動的 CQRS/ES 應用程式。
酒店Hotel是 CQRS 和事件溯源培訓材料中的常見示例域。事件建模網站有一個很好的酒店示例可供研究,這個專案鬆散地基於它的工件。
安裝
- 安裝最新的Node 執行時。本文件假設讀者使用的是 JavaScript,但生成器支援除 JS 之外的其他語言。
- 該專案使用 AsyncAPI 專案的生成器工具從 AsyncAPI 規範生成伺服器框架。在終端中,執行 npm install
- 工具安裝完成後,您可以生成程式碼框架:在終端中,執行 npm run generate
- 這將在output/資料夾中建立一個專案。
要審查的第一個檔案是hotels.yaml規範。它包含一些命令和事件的定義。AsyncAPI 呼叫這些“通道”,它們的定義與普通主題名稱一樣。我使用命名約定將相關頻道組合在一起。
- 命令和事件
{entity}/commands/{command-name} {entity}/events/{event-name} |
該約定按命令和事件影響並代表其狀態的實體對命令和事件進行分組。
- 來賓/命令/註冊
- 客人/活動/註冊
- 酒店/命令/預訂客人
- 酒店/活動/客人預訂
命令和事件共享在headers欄位中儲存後設資料的基本架構。此欄位包含相關性 ID、參與者、時間戳以及您希望跨所有命令和事件型別跟蹤的任何後設資料等內容。這個稱為 的模式位於規範檔案shared-headers的components部分中。
- 檢視(又名讀取模型)
views/{view-name}/{view-id} |
檢視是事件的聚合,通常來自不同的實體。每個檢視例項都有自己的通道例項。這個專案有一個單一的檢視定義:
- 瀏覽量/酒店預訂/{hotelId}
- 生成的程式碼
您可以在output目錄中找到生成的程式碼。這個目錄是一個節點專案,所以要開始,安裝依賴項
在終端中,執行 npm install
安裝完成後,您可以啟動生成的伺服器:
npm start
您將看到描述可用通道。
SUB 表示處理程式正在偵聽通道名稱。PUB 意味著處理程式已準備好釋出訊息。這些處理程式的原始碼都在output/src/api/handlers/,專案中的其餘程式碼是使 API 栩栩如生所需的所有連線。
相關文章
- GitHub - soooban/AxonDemo: 使用Axon/Spring Cloud實現事件溯源和CQRS案例GithubSpringCloud事件
- 使用Redis/RabbitMQ/EventStore實現事件溯源CQRS微服務應用 - Aram KoukiaRedisMQ事件微服務
- 使用Kafka實現事件溯源Kafka事件
- PHP程式碼規範簡潔之道PHP
- PHP 程式碼規範簡潔之道PHP
- booking-microservices:基於.Net Core的CQRS、DDD、垂直切片架構、事件溯源案例ROS架構事件
- 最全面的CQRS和事件溯源介紹 - Software House ASC事件
- 使用EventStoreDB實現事件溯源的Java開源專案事件Java
- 使用Datomic實現沒有麻煩的事件溯源事件
- Android & Java 書寫簡潔規範的程式碼AndroidJava
- Java的CQRS和事件溯源ES入門:如何從CRUD切換到CQRS/ES - BaeldungJava事件
- Spring Boot和EventStoreDB事件溯源案例Spring Boot事件
- 使用EventStoreDB實現事件溯源的Python開源專案事件Python
- 使用TS+Sequelize實現更簡潔的CRUD
- eBay透過事件溯源實現持續交付事件
- Chronicle事件溯源的最佳實踐事件
- 使用Akka實現CQRS/ES的原始碼原始碼
- Promise/A+ 規範的實現Promise
- 事件協作和事件溯源事件
- 事件流與事件溯源事件
- 為什麼我們放棄使用Kafka Streams實現全部的事件溯源?-MateuszKafka事件
- 使用Java實現簡單的鬥地主案例Java
- PHP 事件溯源PHP事件
- 簡潔地使用 vim
- 使用Spring Boot和Kafka Streams實現CQRSSpring BootKafka
- Event Loop的規範和實現OOP
- OpenAPI規範簡介API
- 如何在Java後端中實現事件驅動架構:從事件匯流排到事件溯源Java後端事件架構
- 基於CommonJS規範,簡單實現NodeJs模組化NodeJS
- 剖玄析微聚合 - 事件溯源事件
- 基於事件溯源與CDC的事件驅動微服務架構案例原始碼事件微服務架構原始碼
- 利用 Watermill 實現 Golang CQRSGolang
- 從使用到原理,實現符合Promise A+規範的Promise方法Promise
- mysqldump 使用規範MySql
- Netflix如何在雲端使用事件溯源實現可靠的物聯網裝置管理?事件
- 如何讓客戶方便地使用事件溯源?事件溯源有什麼好處?- daryush_d事件
- PyQt5案例彙總(簡潔版)QT
- 事件溯源全指南 - Arkwrite事件