CQRS 事件存储聚合与投影

CQRS event store aggregate vs projection

在 CQRS 事件存储中,"aggregate" 是否包含事件的汇总视图或仅包含对这些事件边界的引用? (群组编号)

投影是事件的视图或表示,因此在聚合表示边界的情况下,这对我来说是有意义的,而如果聚合包含当前汇总状态,我会对两者之间的重复感到困惑。

In a CQRS event store, does an "aggregate" contain a summarized view of the events or simply a reference to the boundary of those events? (group id)

事件存储中不存在聚合

  • 活动存储在活动商店中
  • 聚合存在于写入模型中(CQRS 的 C)

聚合,在这种情况下,仍然具有与 "Blue Book" 中相同的基本含义;它是围绕一个或多个彼此立即一致的实体的边界的术语。聚合的责任是确保写入(命令)记录簿尊重业务不变性。

在事件存储中,将事件组织到 "streams" 中通常很方便;如果你想象一个 RDBMS schema,流 ID 将只是一些表示 "these events are all part of the same history."

的标识符

通常情况下是一个聚合 -> 一个流,但通常并非总是如此;更改模型时可能需要处理一些特殊情况。 Greg Young 在他的新 eBook on event versioning.

中涵盖了其中的一些内容

So it's possible that the same data structure might exist in the aggregate and query side store (duplicated view used for different purposes).

是,也不是。验证写入时使用的数据结构与用于支持查询的数据结构完全匹配。但存储通常不匹配。换句话说,聚合不会被存储(聚合的 state 会存储);而查询视图被缓存是相当普遍的(同样,不是数据结构本身,而是一种可用于重新填充数据结构而不必重播所有事件的表示)。

Any chance you have an example of aggregate state data structure (rdbms)? Every example I've found is trimmed down to a few columns with something like include id, source_id, version making it difficult to visualize what the scope of an aggregate is

一个常见的例子是交易账户(负责匹配 "buy" 和 "sell" 订单的集合)。

在传统的 RDBMS 存储中,这可能看起来像一本书中的一行 table,具有该书的唯一 ID、有关该书正在跟踪的项目的信息、有关该书的时间的日期信息处于活动状态,依此类推。此外,可能有某种订单 table,具有 uniq id、交易簿 ID、订单类型、交易编号、价格和交易量(换句话说,聚合需要知道的所有信息满足其不变量)。

在文档存储中,您会在一个文档中看到所有这些信息 -- 可能是一个 json 文档,其中包含有关根对象的信息,以及两个订单对象列表(一个用于购买,一个用于销售)。

在活动商店中,您会看到个人 OrderPlacedTradeOccurredOrderCancelled

it seems that the aggregate is computed using the entire set of events unless it gets large enough to warrant a snapshot.

是的,完全正确。如果您熟悉 "fold function",那么事件溯源只是一些常见初始状态的折叠。当快照可用时,我们将从该状态折叠(折叠的事件数量相应减少)

在具有 "snapshots" 的事件源环境中,您可能会看到事件存储和文档存储的组合(其中文档将包含额外的元信息,指示它在事件流中的位置被组装) .