【问题标题】:How can I query for multiple aggregates from event store?如何从事件存储中查询多个聚合?
【发布时间】:2021-02-13 02:17:57
【问题描述】:

假设我通过事件溯源来存储汽车。我有一个 CarAggregate,它可以使用汽车回购正确保存/加载事件:

CarAggregateRepository
{
   CarAggregate GetById(Guid id)
   {
      var events = EventStore.LoadEventsById(id);
      var carAggregate = new CarAggregate(id);
      carAggregate.ApplyEvents(events);

      return carAggregate;
   }

   void Save(CarAggregate car)
   {
      EventStore.StoreEvents(car.Id, car.UncommittedEvents);
   }
}

我现在想要一种方法来查找与特定查询匹配的汽车,例如,梅赛德斯制造的所有汽车:

List<CarAggregate> Find(string manufacturer)
{
   // What goes here?
}

我能想到的唯一方法是:

  1. 加载所有事件
  2. 建立所有聚合的列表
  3. 筛选具有匹配制造商的列表

这肯定是非常低效的,因为我最终可能会从事件存储中加载数十万个单独的事件?这是大量的数据传输。此外,许多加载的聚合可能用于甚至不是 CarAggregates 的东西。也许他们是 UserAggregates,其事件也存储在同一个事件存储中?

我一定错过了什么。如何列出与我的查询匹配的所有 CarAggregates?

【问题讨论】:

  • EventStore 使用的是哪个库?

标签: c# .net cqrs event-sourcing


【解决方案1】:

//这里有什么?

通常的答案是读取模型的接口到那里。

也就是说,您将有一些逻辑从事件存储中获取事件,并从中创建/更新报告,其中包含您需要的某种形状/数据结构/持久性存储中的信息,从而使查询更容易(因此:CQRS )。

一个常见的答案是拥有一个订阅事件存储的进程,也就是说,它监听更改,查询存储以获取新事件的副本,然后更新某些 RDBMS 中的行,您可以使用生成您的报告。

您可以将报告视为事件存储中信息的缓存副本。信息会有点陈旧(这部分取决于您愿意花多少钱来减少延迟)。

您可以对事件存储进行检查点,然后遍历所有事件直到该检查点,以确定哪些汽车与您的查询匹配,但是这样做的延迟很糟糕,并且需要大量重复性工作。因此,我们在后台进行这项工作,您运行查询的不是事件存储“现在”的样子,而是事件存储在最近报告的检查点时的样子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    相关资源
    最近更新 更多