关于问答问题here:
假设我们有ProductCreated和ProductRenamed事件,它们都包含product.now的标题,我们想要在EventStoreDB中查询具有给定标题的ProductCreated和ProductRenamed类型的所有事件。我希望所有这些事件都检查系统中是否有任何产品已经创建或重命名为给定标题,这样我就可以抛出域中重复标题的异常
我使用MongoDB从所有已发布的事件创建UI报告,一切正常there.but用于检查一些不变量,如检查唯一值,我必须查询事件存储中的一些事件及其条件,并通过迭代它们,确定是否存在使用相同标题创建的产品未重命名或使用相同标题重命名的产品。
对于这样的查询,事件存储提供的唯一方法是使用适当的java脚本代码创建一次性投影,该投影过滤所需的事件并将其发送到新的stream.and,然后我所要做的就是从新生成的流中获取事件,该流由该投影填充
不,奇怪的是,投影对于订阅和生成新的流是很好的,但它们对于做实时queries.immediately似乎很奇怪。在我用HTTP api创建了一个投影之后,我检查了查询结果的新结果流,但似乎工作人员没有机会详细说明结果,我得到了404 response.but在等待了几秒钟后,新的流弹出并填充了结果。
这种方法有太多的错误:
首先,似乎如果事件存储被许多流中的数百万个事件填满,它将无法立即处理和过滤所有这些事件,因此stream.it不会立即创建流,更不用说我必须等待一段时间并检查结果的population.so,希望投影已经完成
其次,我必须多次获取并发出多个GET HTTP命令,这似乎是slow.the新的JVM客户端还没有准备好。
第三,我必须在处理完结果后删除结果流,否则将留下数百万个孤立查询结果流的事件存储
我希望我可以将java脚本传递给一些api,并像查询MongoDB一样逐页获得结果,而不用担心投影、新的流和计时问题。
我在Admin UI中看到了一个查询部分,但我不知道它是用来做什么的,不幸的是,文档也没有多大帮助
我是否期望事件存储会做一些不可能的事情?我是否必须创建一个有界的上下文内部读取模型来进行这样的检查?
我正在使用我的事件来解除聚合,并愿意在不获取其他技术的情况下对这些简单的查询使用相同的事件
发布于 2020-09-08 23:57:40
我相信它不会是一个单独的有界上下文,因为您想要执行的检查属于您的Product聚合所在的同一个有界上下文。因此,仅用于防止重复产品名称的投影将是相同上下文的一部分。
您确实可以使用自定义投影来检查它,但我相信这样的解决方案的复杂性将比在MongoDB中使用简单的读取模型更高。
如果您有要进行检查的投影,那么使用现有的投影也是可以的。如果现有投影的目标是在UI中显示内容,则可能不是您所希望的。
对于可以用于重复检查的集合,可以将文档架构限制为id (字符串),即产品标题。因为集合是通过id自动索引的,所以您不需要任何额外的索引来支持重复检查查询。当产品重命名时,您需要删除旧标题的文档并添加一个新标题。
同样,当副本可以滑入时,您将获得一个很小的时间窗口。然后由企业来决定这种担忧是否真实(大多数情况下不是),以及如果有一天发生了这种情况会有什么后果。当投影事件时,你可以很容易地找到一个副本,并决定当它发生时该做什么。
实际上,当您有了这样的投影时,所需要做的就是构建一个简单的域服务bool ProductTitleAlreadyExists。
https://stackoverflow.com/questions/63795724
复制相似问题