使用Java API或HTTP API查询EventStoreDB

问题描述

最近,我一直在使用出色的Greg Young出色的Event Store DB及其功能。但是文档太糟糕了,它已经过时,有时是不正确的,并通过网站分发。有时您必须查找多个不相关的页面才能破坏文档后面的代码

无论如何,不​​仅文档,而且Java API也很糟糕,在大多数情况下,您不得不使用HTTP API。

我已经在HTTP API上构建了自己的Java API。

我一直在努力应对这些投影,并且能够创建多个投影(连续,一次,瞬态),并且效果很好,并且所产生的流中填充了由投影发出的事件。

因此,现在,我知道如何创建新的投影,该投影将创建由在when子句中通过给定条件过滤的期望事件填充的流

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

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

那么,有什么方法可以通过事件存储投影并要求它提供事件?

我了解的一件事是,实际上无法实时查询事件存储,但是我们应该创建一个投影,该投影将创建一个流,并用结果和结果填充它,同时我们应该继续询问该流是否为创建以及投影是否完成。

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

那么我该如何向事件存储库询问所有title等于某个值的ProductCreated事件并立即获得结果?

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

解决方法

很抱歉得知您对本文档的经验。我不确定您是否注意到了,但是我们是在几周前发布了新文档,而旧文档网站却在标语中明确指出了它已经过时了。

事件存储未创建JVM客户端(不是Java客户端)。 new client目前正在开发中,但它是20.6客户端,仅支持gRPC。

您的问题中有很多事情,我不确定我是否全部理解。如果可能的话,最好将问题分开。

我可以回答我所了解的有关读取相同类型事件的信息。系统by event type的投影会产生您可能愿意读取的流(在您的示例中为$et-ProductCreated),但是由于您可能还会遇到类似{{ 1}},您也需要处理它。

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

我建议再提出一个有关时间查询的问题。