【问题标题】:CQRS: Read model projection update in an APICQRS:在 API 中读取模型投影更新
【发布时间】:2021-03-25 20:31:32
【问题描述】:

我想在 API 上实现一个简单的 CQRS。 简而言之:

  1. 命令和查询的独立路由。
  2. 单独的数据库表(目前在同一个数据库上)。一种用于 Command 的规范化,一种用于 Query 的非规范化。
  3. 查询读取模型的异步事件驱动更新,使用现有的外部事件总线。

Command执行完后,自然需要引发一个事件,传递给Event Bus。 事件总线将处理事件并将其传递给它的订阅者。 在这种情况下,订阅者是需要更新的读取模型。

所以我需要 API 上的回调路由,它从命令总线获取事件并更新读取模型投影(即:更新用于查询的非规范化数据库表)。

问题在于读取模型投影的更新既不是命令(我们不执行任何领域逻辑)也不是查询。

问题是: 这个异步读取模型更新应该如何工作才能同时符合 CQRS 和 DDD?

【问题讨论】:

  • 如果您认为回调路由是您问题的重要组成部分,您可以尝试澄清您的担忧。我不太明白你试图在那里表达的想法。

标签: api domain-driven-design cqrs event-bus event-driven-design


【解决方案1】:

此异步读取模型更新应如何工作才能同时符合 CQRS 和 DDD?

我通常认为信息流是一个三角形。

  • 我们通过命令将来自外部世界的信息复制到我们的“写入模型”中
  • 我们将信息从写入模型复制到我们的“读取模型”中
  • 我们通过查询将信息从读取模型复制到外部世界。

中间步骤的通用语言是“投影”。

所以投影(通常)异步运行,查询“写入模型”并更新“读取模型”。

在您概述的架构中,将是订阅总线的投影。当总线发出写模型改变的信号时,我们唤醒投影,让它运行,以便更新读模型。

(注意信息的流动——我们从总线获得的信号触发投影运行,但投影从写入模型复制数据,而不是从事件总线消息。这不是安排事情的唯一方法,但它很简单,因此很容易推断出事情何时开始变成梨形。)

通常情况下,投影在更新读取模型时会存储一些自己的元数据,以免重复工作。

【讨论】:

    猜你喜欢
    • 2017-06-27
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 2019-02-16
    相关资源
    最近更新 更多