【问题标题】:Event Store DB : temporal queries事件存储数据库:时间查询
【发布时间】:2020-09-08 14:10:12
【问题描述】:

关于提问here

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

我正在使用 MongoDB 从所有已发布的事件中创建 UI 报告,并且那里一切正常。但是为了检查一些不变量,例如检查唯一值,我必须查询事件存储中的某些事件及其标准和通过迭代它们,确定是否存在未重命名的具有相同标题的产品或具有相同标题的重命名产品。

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

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

这种方法有太多问题:

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

其次,我必须多次获取并发出多个 GET HTTP 命令,这似乎很慢。新的 JVM 客户端还没有准备好。

第三,我必须在处理完结果后删除结果流,否则会留下数百万个孤立查询结果流的事件存储

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

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

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

我正在使用我的事件来对聚合进行脱水,并愿意将相同的事件用于此类简单查询,而无需获取其他技术

【问题讨论】:

    标签: eventstoredb


    【解决方案1】:

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

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

    如果您有一个投影来进行检查,也可以使用现有投影。如果现有投影的目的是在 UI 中显示事物,那么它可能不是您想要的。

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

    同样,您将获得一个小的时间窗口,当重复项可以溜进来时。然后由企业来决定问题是否真实(大多数情况下并非如此)以及如果发生这种情况的后果是什么有一天会发生。在投影事件时,您可以很容易地找到重复项,并决定在发生事件时做什么。

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

    【讨论】:

    • 检查具有唯一标题的产品是一个示例,显示我们是否可以查询事件存储数据库。根据您的描述,我得出结论,无法查询事件存储数据库,我们从其他人那里知道和体验查询的方式。投影并不等同于查询,至少在它们提供结果的方式上不等价。有一些童话般的简单查询是通过检查某些事件的简单标准而构建的,并意识到我应该使用我的 BC 中的另一个写入模型可以做到这一点。我希望我可以像查询 MongoDB 一样查询事件存储数据库。无论如何,谢谢
    • 好吧,让我们把事情说清楚。如果我们谈论时间查询,应该有一个涉及时间的概念。就像“这件事发生了,在 5 分钟内发生了其他事情”。当涉及到查询时,我认为了解查询事件与查询状态有很大不同是很重要的。尽管您可以为查询编写临时投影,但这不是您在应用程序中使用的主要用例。 eventstore.com/blog/projections-4-event-matching
    猜你喜欢
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    相关资源
    最近更新 更多