【问题标题】:CQRS+ES: irrelevant Command/Event for Aggregate but important for ProjectionCQRS+ES:对聚合无关的命令/事件,但对投影很重要
【发布时间】:2018-11-01 16:47:05
【问题描述】:

我有Application 聚合,它可以处理命令,例如RegisterInstall >、卸载隐藏显示ChangeOwner发布 CancelPublication...Application aggregate 中有大约 20 个命令。每个 command 检查 Application 的不变量,例如 Application 可以是:

  • 在名称、描述和其他详细信息有效时发布
  • 隐藏仅在发布时,
  • 安装不是由所有者以及在它发布之后,
  • PublicationCanceled 当没有安装时...

应用程序命令有效时生成相应的事件事件projections流程管理器处理。

我有 ApplicationStatistics projection - 他们处理来自 Application 聚合 的事件>,两个 projections 都是 100% 基于 events,因此 projections 可以完全删除并从头开始重建。 ApplicationStatistics projections 由用户通过 http:get endpoint

请求

问题

现在我有一个来自业务分析的请求,以跟踪潜在客户何时打开应用程序。通过打开,他们了解潜在客户会看到应用程序 预测详细信息,例如(名称、描述、价格、功能、优势、安装数量、评论。 ..)。

现在我想知道是否允许我在 Application 聚合 中创建 Open 命令。它不会改变聚合状态,不变量与它无关。由于统计预测,才需要此命令

另外的问题是,一些应用程序每天可能会被访问​​数百次,因此当聚合被处理时,它会产生大量的事件来处理加载到内存中。

您是否认为在 Application 聚合中创建 Open command 以发出 Opened 事件 是解决这个问题的好方法吗?

【问题讨论】:

  • 看起来你必须决定这只是一个访问控制的东西还是真正的域功能......那么也许在另一个有界上下文中?
  • 谢谢,这似乎是 Analytics BC 的责任,但 Opened 事件可能有助于应用程序聚合中的应用程序评分算法 - 在这个阶段很难说。

标签: events domain-driven-design cqrs event-sourcing aggregateroot


【解决方案1】:

Application 聚合能否拒绝 Open 命令? 如果不能,那真的是命令吗?

我们向聚合发出命令以验证它们,如果聚合的当前状态不允许执行命令,则可能会拒绝它们。

如果 Open 命令不能被拒绝,并且您仍然决心通过事件解决用户跟踪,您可以考虑简单地发出 ApplicationOpened 事件,而不发出聚合的命令。

另一种选择是在另一个系统中完全跟踪用户操作和统计信息,也许只是向数据库表中添加行。

【讨论】:

  • 是的,可以拒绝打开命令,即未发布时无法打开应用程序。我已经通过将所有这些统计/分析内容移动到单独的 BoundedContext 来解决这个问题。无论如何,感谢您对问题的不同看法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
  • 2021-05-19
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
相关资源
最近更新 更多