事件存储数据库:时间查询

Event Store DB : temporal queries

关于提问 :

假设我们有 ProductCreated 和 ProductRenamed 事件,它们都包含 product.now 的标题我们想查询 EventStoreDB 以获取具有给定 title.i 的所有 ProductCreated 和 ProductRenamed 类型的事件想要所有这些事件检查系统中是否有任何已创建或重命名为给定标题的产品,以便我可以抛出域中重复标题的异常

我正在使用 MongoDB 从所有已发布的事件中创建 UI 报告,一切都很好 there.but 检查一些不变量,比如检查唯一值,我必须要么在事件存储中查询一些事件及其条件,并通过遍历它们,确定是否存在使用相同标题创建但未重命名的产品或使用相同标题重命名的产品。

对于此类查询,事件存储提供的唯一方法是使用适当的 java 脚本代码创建 one-time 投影,该脚本代码过滤所需的事件并将其发送到新的 stream.and 然后我所要做的就是从由投影填充的新生成的流中获取事件

奇怪的是,投影非常适合订阅和生成新流,但在我使用 HTTP api 创建投影后进行实时 queries.immediately 时它们似乎很奇怪,我检查了查询结果的新结果流,但似乎工作人员没有机会详细说明结果,等待几秒钟后我得到 404 response.but,新流弹出并且得到结果。

这种方法有太多错误:

首先,如果事件存储中充满了跨多个流的数百万个事件,它将无法立即处理和过滤所有事件,结果 stream.it 不会立即创建流,更不用说population.so我必须等待一段时间并检查结果希望投影完成

其次,我必须多次获取并发出多个 GET HTTP 命令,这似乎是 slow.the 新的 JVM 客户端尚未准备好。

第三,我必须在处理完结果后删除结果流,如果不这样做,事件存储将留下数百万个孤立的查询结果流

我希望我可以将 java 脚本传递给某些 api 并像查询 MongoDB 一样逐页获取结果,而不必担心投影、新流和计时问题。

我在管理中看到了一个查询部分 UI,但我不知道那是干什么用的,不幸的是文档没有多大帮助

我是否希望事件存储做一些不可能的事情? 我是否必须创建一个有界上下文内部读取模型来进行此类检查?

我正在使用我的事件对聚合进行脱水,并且愿意在不获取其他技术的情况下将相同的事件用于此类简单查询

我相信它不会是一个单独的限界上下文,因为您要执行的检查属于您的 Product 聚合所在的同一限界上下文。因此,仅用于防止重复产品名称的投影将成为同一上下文的一部分。

您确实可以使用自定义投影来检查它,但我相信这种解决方案的复杂性会高于 MongoDB 中的简单读取模型。

如果你有一个投影来做检查,也可以使用现有的投影。如果现有投影的目的是在 UI.

中显示内容,那么它可能不是您想要的

对于可用于重复检查的 collection,您可以将文档架构限制为仅 id(字符串),即产品标题。由于 collections 自动由 id 索引,您不需要任何额外的索引来支持重复检查查询。当产品重命名时,您需要删除旧标题的文档并添加新标题。

同样,您将有一小段时间 window 当重复项可以溜进来时。然后由企业决定问题是否真实(大多数情况下不是)以及问题是什么如果有一天发生这种情况的后果。在预测事件时,您可以很容易地找到重复项,并决定在它发生时该怎么做。

实际上,当您有这样的投影时,只需构建一个简单的域服务 bool ProductTitleAlreadyExists