domain-driven-design - 我应该如何更新事件源聚合中的复制数据?
问题描述
人为的例子,但是说我有一个实体的Order
聚合。OrderLine
订单行包含成本、数量和产品名称。聚合作为事件源的事件被持久化。通常,单个产品可能有数百万个订单。
我现在必须更新产品名称。更新产品汇总很简单,但我现在有数百万个使用旧产品名称的订单。
这是一个人为的例子,但假设我需要在我的订单中更新这个复制的状态。这里最好的方法是什么?将状态更改应用于如此大量的记录似乎是非常昂贵的操作。
解决方案
一般来说,当事件溯源时,事件是不可变的:它们代表已经明确发生的事情,你无法改变过去。如果有人订购了产品“Foo”,那么稍后说他们订购了“Bar”有什么好处?
架构迁移有一个小例外,在确保读取事件的任何内容都可以使用旧编码或新编码之后,这可能是操作事件存储的脱机进程。这不会改变事件的语义。
如果您确实需要更正每个聚合,可以记录新事件(例如从订单中删除旧产品并添加新产品)。这将倾向于按顺序完成:请记住,聚合倾向于定义一致性边界,因此这将是最终一致的(您可以并行执行任意多个聚合更新:事件源系统往往可以轻松地大规模并行化这类事情)。
推荐阅读
- sql - 交易不回滚,违反 PK
- cocoapods - 如果您对多个 Podspec 使用单个存储库,则 Pod install 多次克隆存储库
- rust - HashMap Entry API 的生命周期/借用问题
- tomcat - HAproxy 2后面的Tomcat 6,只显示一个白页
- pandoc - 提取媒体时如何防止 Pandoc 覆盖现有文件?
- docker - 在 docker 中打开多个 Wordpress 项目
- r - 如何将字符串放入 data.table 中的 keyby 参数中
- javascript - D3js X 轴标签样式左对齐
- c# - 试图将密集的传入串行数据打印到richtextbox
- php - 主键值的“字段列表”中的未知列?