【问题标题】:EventStore Subscribing to a stream for a categoryEventStore 订阅一个类别的流
【发布时间】:2020-10-27 20:17:11
【问题描述】:

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

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

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

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

我想也是

  • 我错过了流名称的重点,并且命名错误
  • 错过了选择它的方法,例如“product-*”
  • 它应该订阅“所有”并过滤掉您不感兴趣的内容,尽管这会产生问题,它还会发送所有“统计”事件

有什么建议吗?

【问题讨论】:

标签: .net cqrs event-sourcing eventstoredb


【解决方案1】:

在您的预测中,您可以使用 fromCategory()。 EventStore 按流的名称对每个流进行分类,直到第一个“-”。所以你的 'order-123' 和 'order-456' 流都在 'order' 类别中。

所以你可以这样做:

fromCategory('order')
  .whenAny(function(s,e) {
    linkTo('orders',e);
  });

这会将所有订单聚合中的所有订单相关事件投射到您可以订阅的单个“订单”流中。

您需要确保类别预测正在运行。 (我使用EventStore已经有一段时间了,它在预测处于测试阶段并且默认未启用时又回来了,不确定最新版本是否相同)

【讨论】:

  • 完美,这正是我想要的!
【解决方案2】:

来自The cost of creating a stream article

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

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

所以这个想法是,您可以创建两个投影来向一些 productsorders 流发送事件。

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

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

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

【讨论】:

  • 在这种情况下,我会更倾向于完整的投影而不是类型。不过,我不知道如何通过投影来做我想做的事。您可以使用“fromstream('product-123')”创建一个,但我看不出如何在不手动添加所有我无法做到的 ID 的情况下将所有“product-xxx”投影到一个流中。
  • 我看不到使用普通投影的方法来执行此操作,也许我需要通过选择事件类型来使用您的第二个想法?我基本上想要“产品”和“订单”聚合的每种事件类型。这确实意味着我每次创建新事件类型时都需要手动更改投影。
  • 其他方法:创建 productsorders 流,然后投射到特定于 Id 的流(例如 product-553storing 所有具有 Id 553 的产品的事件),指定事件元数据中的聚合类型在投影中执行过滤。
  • @jnovo,你能在这里看看我的问题吗:stackoverflow.com/questions/52447808/…?它类似于这个问题。 +1。
【解决方案3】:

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

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

【讨论】:

  • 感谢您的回答,但马特已经提供了这个答案,我已经接受了。
  • 没关系,但我在这里没有看到任何人提到 $ce-stream。这是默认存在的 GES 默认投影。我看到 Matt 提到了“类别投影”,当然这是同一个,但是,您不必创建单独的聚合流,它可以使用我提到的开箱即用的名称。
  • 没问题。为未来的人们提供的信息越多越好。
  • 我自己使用了 fromCategory().link,直到我意识到这完全没有必要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 2019-09-24
  • 1970-01-01
  • 2015-10-02
相关资源
最近更新 更多