我最近一直在使用brilliant Greg Young的brilliant Event Store DB,它很好。但是文档很糟糕,它过时了,有时是不正确的,并通过网站分发。有时,您必须查找多个不相关的页面来打破文档背后的代码!
无论如何,不仅是文档,Java API也很糟糕,大多数时候您必须使用HTTP API。
我已经在HTTP API上构建了我自己的Java API。
我一直在努力处理投影,我能够创建多个投影(连续的,一次性的,瞬态的),它工作得很好,结果流由投影发出的事件填充。
现在,我知道了应该如何创建新的投影,这些投影将创建填充了我想要的事件的流,这些事件由when子句中的给定条件过滤
我还在文档中读到,我们可以在事件存储上进行时态查询,但我们应该借助Catch-up subscription填充另一个读取模型,我对此很满意,并且知道什么是CQRS。我正在使用MongoDB为报表创建读取模型。
我遇到的困难是时间查询。我找不到任何关于我应该如何进行查询的文档。但是我猜我应该首先为每个查询创建一个一次性的投影,并且我应该将结果发送到一个新的流名为" query -{id}“。然后,我立即尝试从新的查询流中读取事件,但创建查询流并用结果事件填充它需要时间。因此,我的查询API创建了一个投影,并立即请求结果流上的事件,但它得到了404,这意味着该投影还没有开始处理和生成新的流。
那么,有没有办法传递一个事件存储投影并向它请求事件呢?
我理解的一件事是,实际上没有办法实时查询事件存储,但我们应该创建一个投影,它将创建一个流,并用结果和均值填充它,同时我们应该不断询问流是否创建,以及投影是否完成。
我为我的每个聚合创建了一个新的流,一切都运行得很好。我有一个单独的有界上下文来报告整个系统,它使用MongoDB,这可以很好地实现。但有时我需要查询事件来检查不变量。例如,我需要检查"Product“标题是否唯一并抛出异常。为了做这样的检查,我应该为每个有界上下文中的聚合创建一个单独的读取模型。但我只想通过向事件存储请求所有具有相同标题的"ProductCreated“事件来执行此类查询,然后我希望处理所有这些事件,以查看是否有具有相同标题的产品。
那么,如何向事件存储请求标题等于某个值的所有ProductCreated事件并立即获得结果呢?
或者也许事件存储数据库不是为这样的用例而设计的?!
发布于 2020-09-08 21:03:17
听说您使用文档的经历,我感到很遗憾。我不知道你是否注意到了,但是我们在几周前发布了新的文档,旧的文档网站在横幅中清楚地表明它已经过时了。
JVM客户端(不是Java客户端)不是由Event Store创建的。new client目前正在开发中,但它是20.6客户端,将只支持gRPC。
在你的问题中有相当多的东西,我不确定我理解所有的东西。如果可能的话,将问题分开是很好的。
我可以回复我理解的一个,关于阅读相同类型的事件。系统by event type投影生成您可能愿意读取的流(在您的示例中为$et-ProductCreated),但我不确定它是否解决了您的用例,因为您可能也有像ProductRenamed这样的事件,并且您也需要处理它。
我不会真的认为这种情况是“不变的”,因为如果两个产品意外地获得相同的标题,您的系统不太可能变得不一致。这取决于您希望在系统中同时注册和重命名的产品数量。如果您的新产品以每秒100个产品的速度注册,您可能无论如何都无法读取所有ProductCreated事件来确定新名称是否与另一个名称重复。如果您每小时有一个产品,那么对MongoDB进行简单的投影将是检查重复项的最简单、最快的方法。
我建议打开另一个关于时间查询的问题。
https://stackoverflow.com/questions/63794162
复制相似问题