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

问题描述

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

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

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

解决方法

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

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

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