EventStore订阅类别的流

eye*_*aul 10 .net cqrs event-sourcing get-event-store

我已经开始在.Net中创建一个测试应用程序,它使用Greg Young的EventStore作为CQRS/ES的后备存储.

为了便于加载完整聚合,我保存到名为"agg-123"的流.例如,对于id为553的产品聚合,会有一个名为"product-553"的流.然后,对于"Order"聚合,该流将被命名为"order-123".

从补充和保存事件来看,这很有效.

我现在正在尝试创建一个侦听器,它将侦听某些流,然后填充查询数据库.我看到的订阅方法似乎只能订阅"order-123"或"all".我看不出如何订阅"product-"或"order-",或两者兼而有之.

我想也是

  • 我错过了流名称的观点,并将它们命名为错误
  • 错过了选择它的方法,比如"product-*"
  • 预计会订阅"所有"并过滤掉您不感兴趣的内容,但这会产生问题,即它还会发送所有"统计信息"事件

有人建议吗?

Mat*_*att 7

在您的投影中,您可以使用fromCategory().EventStore按流的名称对每个流进行分类,直到第一个" - ".因此,您的'order-123'和'order-456'流都属于'订单'类别.

所以你可以这样做:

fromCategory('order')
  .whenAny(function(s,e) {
    linkTo('orders',e);
  });
Run Code Online (Sandbox Code Playgroud)

这会将所有订单聚合中的所有订单相关事件投影到您可以订阅的单个"订单"流中.

您需要确保类别预测正在运行.(自从我使用EventStore已经有一段时间了,当预测处于测试阶段并且默认情况下未启用时,它已经回来了,不确定最新版本中的内容是否相同)


jno*_*ovo 5

创建流文章的成本

通常,当人们只想要几个流时,是因为他们想以某种方式为特定类型的读者阅读内容。这可以通过其他方式完成。在内部,事件存储本质上是一个基于主题的发布/订阅。您可以做的是利用投影重新分区您的流,以帮助提供给特定的读者。例如,假设读者对所有 InventoryItemCreated 和 InventoryItemDeactivated 事件感兴趣,但对系统中的所有其他事件不感兴趣。当我们有数百万个流中的事件时,仍然可以支持这个流。

为此,我们将创建一个投影来重新索引流。

所以这个想法是你可以创建两个投影来向 someproductsorders流发出事件。

在同一篇文章中提到了系统按类型投影,它为每个事件类型创建一个名为 的流$et-{typename}。这对您的情况也很有用。

例如,如果您只对观察聚合的创建感兴趣,则可以订阅相应的流。假设您有一些productCreatedandorderCreated事件,您只需订阅$et-productCreatedand$et-orderCreated事件。从这些流接收事件后,您还可以通过使用来自事件的来订阅单个流(例如product-553order-123)。Id*Created

(注意:默认情况下禁用投影,一旦启用,您可能需要手动启动按类型投影。)


Ale*_*rev 5

您需要检查投影是否正在运行,因为在撰写本文时此功能默认处于禁用状态,因为投影功能仍处于测试阶段。

有一种称为类别投影的特殊类型投影,这正是您可能需要的。如果您有按照name-id模式命名的流,例如product-123, product-234,您可以订阅$ce-product流以接收保存到这些流的所有事件。

  • 没关系,但我还没有看到这里有人提到 $ce- 流。这是默认存在的 GES 默认投影。我看到马特提到了“类别投影”,当然这是完全相同的,但是,您不必创建单独的聚合流,它可以在我提到的开箱即用的名称下使用。 (3认同)
  • 我自己使用了 fromCategory().linkto ,直到我意识到这完全没有必要。 (2认同)