events - CQRS+ES:对聚合无关的命令/事件,但对投影很重要
问题描述
我有Application 聚合,它可以处理Register、Install、Uninstall、Hide、Show、ChangeOwner、Publish、CancelPublication等命令...... Application聚合中大约有 20 个命令。每个命令检查 Application 的不变量,例如Application可以是:
- 在名称、描述和其他详细信息有效时发布,
- 仅在发布时隐藏,
- 不是由所有者安装,而是在发布后安装,
- 没有安装时已取消发布...
当命令有效时,应用程序会生成相应的事件。事件由预测和流程管理器处理。
我有Application和Statistics 投影- 它们处理来自Application aggregate的事件,两个预测都是 100% 基于events,因此可以完全删除投影并从头开始重建。用户通过http:get 端点请求应用程序和统计信息 预测
问题:
现在我有一个来自业务分析的请求,以跟踪潜在客户何时打开应用程序。通过打开,他们了解潜在客户会看到应用程序投影详细信息,例如(名称、描述、价格、功能、优势、安装数量、评论......)。
现在我想知道是否允许我在Application aggregate创建Open命令。它不会改变聚合状态,不变量与它无关。由于统计预测,才需要此命令。
另一个问题是,某些应用程序可能每天被访问数百次,因此当聚合加载到内存中时,它可以生成大量事件来处理。
您认为在Application聚合中创建Open 命令以发出Opened事件是解决此问题的好方法吗?
解决方案
应用程序聚合可以拒绝打开命令吗?如果不能,那真的是命令吗?
我们向聚合发出命令以验证它们,如果聚合的当前状态不允许执行命令,则可能会拒绝它们。
如果Open命令不能被拒绝,并且您仍然决心通过事件解决用户跟踪问题,您可以考虑简单地发出ApplicationOpened事件,而不向聚合发出命令。
另一种选择可能是完全跟踪另一个系统中的用户操作和统计信息,也许只是将行添加到数据库表中。
推荐阅读
- mysql - 如何在mysql中选择与其他随机结果匹配的结果
- javascript - 推迟js的有效方法
- java - 获取用户对 HashMap 的输入作为键并在 Java 中打印其各自的值
- angular - 将视图路由器出口更改为侧栏
- html - 在纯 HTML 中隐藏和显示 div?
- python - TypeError: zip 参数 #1 必须支持 Python 中的迭代
- java - 对不同的数据结构使用相同的接口有什么好处?
- javascript - 即使硬编码,我的电子邮件也被强制从 .com.sg 更改为 .sg
- javascript - 使用 Google Docs API 查找表起始位置索引
- javascript - await 在异步函数中效率不高