使用 java API 或 HTTP API 查询 EventStoreDB

Querying EventStoreDB with java API or HTTP API

我最近一直在使用由出色的 Greg Young 设计的出色的 Event Store DB,它很好。但是文档很糟糕,它已经过时,有时不正确,并且通过网站分发。有时您必须查找多个不相关的页面才能破解文档背后的代码!

无论如何,不​​仅是文档,而且 Java API 都很糟糕,大多数时候你必须使用 HTTP API 来代替。

我在 HTTP API.

上构建了自己的 Java API

我一直在为投影而苦苦挣扎,我能够创建多个投影(连续的、一次的、瞬态的)并且它工作得很好并且生成的流中填充了投影发出的事件。

所以现在,我知道我应该如何创建新的投影,这将创建流,其中填充了我想要的事件,这些事件是根据 when 子句中的给定条件过滤的

我还在文档中读到我们可以在事件存储上进行临时查询,但我们应该在 Catch-up 订阅的帮助下填充另一个读取模型,我对此很满意并且知道 CQRS 是什么。我正在使用 MongoDB 创建报告的读取模型。

我遇到的困难是时间查询。我找不到任何关于我应该如何查询的文档。但我猜我应该首先为每个查询创建一个 one-time 投影,然后我应该将结果发送到一个新的流名称“query-{id}”。然后我立即尝试从新的查询流中读取事件,但是创建查询流并用结果事件填充它需要时间。因此,我的 API 查询创建了一个投影并立即在结果流上请求事件,但它得到 404,这意味着投影尚未开始处理和生成新流。

那么,有什么方法可以传递事件存储投影并向其请求事件吗?

我理解的一件事是,实际上没有办法实时查询事件存储,但我们应该创建一个投影,它将创建一个流并用结果和平均值填充它,同时我们应该继续询问是否流是否创建,投影是否完成。

我为每个聚合创建了一个新流,一切正常。我有一个单独的限界上下文来报告整个系统,它使用 MongoDB 并且工作正常。但有时我需要查询事件来检查不变量。例如,我需要检查“产品”标题是否唯一并抛出异常。为了进行此类检查,我应该为每个限界上下文中的聚合创建一个单独的读取模型。但是我想简单地通过向事件存储询问所有具有相同标题的“ProductCreated”事件来进行此类查询,然后我想处理所有这些事件以查看我们是否有具有相同标题的产品。

那么我如何向事件存储请求标题等于某个值的所有 ProductCreated 事件并立即获得结果?

或者事件存储数据库不是为此类用例设计的?!

得知您对文档的体验,我们深感抱歉。我不确定您是否注意到,但我们在几周前发布了新文档,而旧文档网站在横幅中明确指出它已过时。

JVM 客户端(不是 Java 客户端)不是 Event Store 制作的。 new client 目前正在开发中,但它是 20.6 客户端,将仅支持 gRPC。

你的问题有很多东西,我不确定我是否全部理解。如果可能的话,最好把问题分开。

我可以回复我理解的,关于阅读同类事件。系统 by event type 投影生成您可能愿意从中读取的流(在您的示例中为 $et-ProductCreated),但我不确定它是否解决了您的 use-case 因为您可能还会遇到类似的事件ProductRenamed 你也需要处理它。

我不会真的将这种情况视为“不变”,因为如果两个产品意外获得相同的标题,您的系统不太可能变得不一致。这取决于您希望在系统中同时注册和重命名的产品数量。如果您有新产品以每秒 100 个产品的速度注册,您可能无法读取所有 ProductCreated 事件以查明新名称是否与另一个名称重复。如果您每小时有一个产品,对 MongoDB 进行简单投影将是检查重复项的最简单和最快的方法。

我建议打开另一个关于时间查询的问题。