CQRS:在 API 中读取模型投影更新
CQRS: Read model projection update in an API
我想在 API 上有一个简单的 CQRS 实现。
简而言之:
- 命令和查询的单独路由。
- 单独的数据库 tables(目前在同一个数据库上)。一个用于命令的标准化,一个用于查询的非标准化。
- 查询读取模型的异步事件驱动更新,使用现有的外部事件总线。
Command执行后,自然要引发一个事件传递给Event Bus。
事件总线将处理事件并将其传递给它的订阅者。
在这种情况下,订阅者是需要更新的读取模型。
所以我需要 API 上的回调路由,它从命令总线获取事件并更新读取模型投影(即:更新用于查询的非规范化数据库 table ).
问题是读取模型投影的更新既不是命令(我们不执行任何域逻辑)也不是查询。
问题是:
此异步读取模型更新应如何工作才能与 CQRS 和 DDD 兼容?
How should this async Read Model update work in order to be compliant both with CQRS and DDD?
我通常认为信息流是一个三角形。
- 我们通过命令将外部世界的信息复制到我们的“写入模型”中
- 我们将写入模型中的信息复制到我们的“读取模型”中
- 我们通过查询将信息从读取模型复制到外部世界。
中间步骤的通用语言是“投影”。
所以投影(通常)运行是异步的,查询“写入模型”并更新“读取模型”。
在您概述的体系结构中,它是订阅总线的投影。当总线发出写入模型已更改的信号时,我们唤醒投影,并让它 运行 以便它可以更新读取模型。
(注意信息流——我们从总线获得的信号触发到 运行 的投影,但投影从写入模型复制数据,而不是从事件总线消息复制数据。这不是这是安排事情的唯一方法,但它很简单,因此很容易推断出事情什么时候开始变得梨形。)
通常情况下,projection在更新读取模型的时候会存储一些自己的元数据,以免重复工作。
我想在 API 上有一个简单的 CQRS 实现。 简而言之:
- 命令和查询的单独路由。
- 单独的数据库 tables(目前在同一个数据库上)。一个用于命令的标准化,一个用于查询的非标准化。
- 查询读取模型的异步事件驱动更新,使用现有的外部事件总线。
Command执行后,自然要引发一个事件传递给Event Bus。 事件总线将处理事件并将其传递给它的订阅者。 在这种情况下,订阅者是需要更新的读取模型。
所以我需要 API 上的回调路由,它从命令总线获取事件并更新读取模型投影(即:更新用于查询的非规范化数据库 table ).
问题是读取模型投影的更新既不是命令(我们不执行任何域逻辑)也不是查询。
问题是: 此异步读取模型更新应如何工作才能与 CQRS 和 DDD 兼容?
How should this async Read Model update work in order to be compliant both with CQRS and DDD?
我通常认为信息流是一个三角形。
- 我们通过命令将外部世界的信息复制到我们的“写入模型”中
- 我们将写入模型中的信息复制到我们的“读取模型”中
- 我们通过查询将信息从读取模型复制到外部世界。
中间步骤的通用语言是“投影”。
所以投影(通常)运行是异步的,查询“写入模型”并更新“读取模型”。
在您概述的体系结构中,它是订阅总线的投影。当总线发出写入模型已更改的信号时,我们唤醒投影,并让它 运行 以便它可以更新读取模型。
(注意信息流——我们从总线获得的信号触发到 运行 的投影,但投影从写入模型复制数据,而不是从事件总线消息复制数据。这不是这是安排事情的唯一方法,但它很简单,因此很容易推断出事情什么时候开始变得梨形。)
通常情况下,projection在更新读取模型的时候会存储一些自己的元数据,以免重复工作。