我应该如何更新事件源聚合中的复制数据?

How should I update copied data in event sourced aggregate?

人为的例子,但假设我有一个 Order 聚合与 OrderLine 个实体。订单行包含成本、数量和产品名称。聚合作为事件持久化,以事件为源。通常,单个产品可能有数百万个订单。

我现在必须更新产品名称。更新产品聚合非常简单,但我现在有数百万个使用旧产品名称的订单。

这是一个人为的例子,但假设我需要在我的订单中更新这个复制的状态。这里最好的方法是什么?将状态更改应用于如此大量的记录似乎是非常昂贵的操作。

一般来说,当事件溯源时,事件是不可变的:它们代表已经明确发生的事情,你无法改变过去。如果有人订购了产品“Foo”,后来说他们订购了“Bar”有什么好处?

架构迁移有一个小例外,这可能是在确保读取事件的任何内容都可以使用旧编码或新编码后,一个离线过程操作事件存储。这不会改变事件的语义。

如果您确实需要更正每个聚合,可以记录新事件(例如从订单中删除旧产品并添加新产品)。这往往是按顺序完成的:记住聚合倾向于定义一致性边界,所以这将是最终一致的(你可以并行执行任意多的聚合更新:事件源系统对于这类事情往往是微不足道的大规模并行化).