首页 > 解决方案 > 我应该如何更新事件源聚合中的复制数据?

问题描述

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

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

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

标签: domain-driven-designevent-sourcingevent-driven-designaggregates

解决方案


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

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

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


推荐阅读