【问题标题】:Can I depend on aggregate while preparing read-model我可以在准备读取模型时依赖聚合吗
【发布时间】:2015-10-11 01:40:49
【问题描述】:

我正在尝试在我的应用程序的某些部分实现 CQRS 模型,其余部分以 CRUD 样式处理。在写入方面,当我在命令处理程序中发布命令时,我将加载聚合并生成必要的事件并将它们存储在 EventStore 中,并将发布这些事件以创建/更新读取模型。我的问题是

  1. 在命令处理程序中,我可以在处理生成任何事件/验证请求的命令时加载 CRUD 处理的实体/模型吗?
  2. 这里的 EventStore 意味着它可以在内存中的事件队列/任何类型的数据库中,对吧?
  3. 我可以从命令处理程序的相关聚合中发布事件吗?
  4. 在生成读取模型时,我可以从过去的事件和当前事件中重新生成聚合吗?

【问题讨论】:

标签: design-patterns crud cqrs event-sourcing


【解决方案1】:

一个字回答标题问题:没有。

您的读取模型应仅取决于聚合生成的事件。您可能有多个读取模型:一个用于 ui,另一个用于报告,一个用于日志记录,另一个用于统计,仅举几例。

您不希望任何读取模型在您更改写入模型时中断。您也不希望您的写入模型受到任何读取模型的约束。

将事件作为唯一依赖项可以很好地分离。

所以,对于其他问题:

  • 命令处理程序将从存储库加载一个聚合,更新 它,然后将其保存到存储库。
  • 命令处理程序不会生成事件,聚合会。
  • 请求验证通常在将命令发送到处理程序之前完成,但如果处理程序是您的第一步,则必须在那里进行验证。
  • 事件存储仅存储事件,以便您以后可以检索它们,用于一个聚合并以正确的顺序。存储事件的方式和位置取决于您。
  • 相关的聚合通常在 sagas / 流程管理器中处理。造成这种情况的一个原因是,一次更新多个聚合会很快变得混乱。
  • 通过侦听事件流在事后生成读取模型。如何以及何时进行聆听取决于您。您可以通过侦听事件调度程序在进程内执行此操作,也可以通过从持久数据存储中读取某个检查点之后的所有事件来在进程外执行此操作。
  • 每次从存储库中检索聚合时,都会重新生成一个聚合。存储库的工作是读取聚合的所有事件并应用它们。

【讨论】:

  • 很好的解释。感谢您的宝贵时间。
  • 因此,如果我要划分我的项目(例如 read-aggregate-endpoint),我应该我的读取模块不应该对聚合有任何依赖。这是否意味着我应该在聚合模块之外的其他地方举办这些活动?
猜你喜欢
  • 2011-01-23
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 2016-01-13
  • 2013-11-12
  • 2011-06-30
  • 1970-01-01
  • 2022-05-26
相关资源
最近更新 更多