【发布时间】:2020-12-26 20:30:34
【问题描述】:
我最近一直在使用出色的 Greg Young 出色的 Event Store DB,它很好。但是文档很糟糕,它已经过时,有时不正确,并且通过网站分发。有时您必须查找多个不相关的页面才能破坏文档背后的代码!
不管怎样,不仅是文档,Java API 也很糟糕,而且大多数时候你不得不使用 HTTP API。
我已经在 HTTP API 的基础上构建了自己的 Java API。
我一直在为投影而苦苦挣扎,我能够创建多个投影(连续、一次、瞬态),并且效果很好,并且生成的流中填充了投影发出的事件。
所以现在,我知道我应该如何创建新的投影,这将创建填充了我想要的事件的流,这些事件由 when 子句中的给定条件过滤
我还在文档中读到我们可以对事件存储进行时间查询,但我们应该借助 Catch-up 订阅填充另一个读取模型,我对此很好并且知道 CQRS 是什么。我正在使用 MongoDB 为报告创建读取模型。
我遇到的困难是时间查询。我找不到任何关于我应该如何进行查询的文档。但我猜我应该首先为每个查询创建一个一次性投影,然后我应该将结果发送到一个新的流名称“query-{id}”。然后我立即尝试从新查询流中读取事件,但是创建查询流并用结果事件填充它需要时间。因此,我的查询 API 创建了一个投影并立即请求结果流上的事件,但它得到 404,这意味着该投影尚未开始处理和生成新流。
那么,有没有什么方法可以传递事件存储一个投影并询问它的事件?
我理解的一件事是实际上没有办法实时查询事件存储,但我们应该创建一个投影,它将创建一个流并用结果和平均值填充它,同时我们应该继续询问流是否是已创建以及投影是否完成。
我为每个聚合创建了一个新流,一切正常。而且我有一个单独的有界上下文来报告整个系统,它使用 MongoDB 并且可以正常工作。但有时我需要查询事件以检查不变量。例如,我需要检查“产品”标题是否唯一并抛出异常。为了进行这样的检查,我应该为每个有界上下文中的聚合创建一个单独的读取模型。但是我想通过向事件存储询问所有具有相同标题的“ProductCreated”事件来进行此类查询,然后我想处理所有这些事件以查看我们是否有一个具有相同标题的产品。
那么,我如何向事件存储询问所有 ProductCreated 事件,其中 title 等于某个值并立即获得结果?
或者事件存储数据库不是为此类用例设计的?!
【问题讨论】:
标签: projection querying eventstoredb