使用AsyncAPI规范简洁实现CQRS事件溯源案例


事件溯源从业者使用事件捕获方法(如事件风暴和事件建模)设计他们的领域。这项工作的输出通常是真实或数字白板上的大量便利贴。从这个模型中,开发人员必须填写很多关于命令、事件和读取模型的细节来构建一个工作系统。这个映射过程是手动的,发生在他们的脑海中。人工检查和测试套件可确保代码与即时贴匹配。这个过程并不理想,因为实际系统可能不是事件模型所期望的。
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
您将看到描述可用通道。

SUB 表示处理程序正在侦听通道名称。PUB 意味着处理程序已准备好发布消息。这些处理程序的源代码都在output/src/api/handlers/,项目中的其余代码是使 API 栩栩如生所需的所有连接。