【问题标题】:Domain-driven design, event sourcing and evolving models领域驱动设计、事件溯源和演化模型
【发布时间】:2013-08-04 02:47:32
【问题描述】:

Eric Evans 经常谈到 DDD 中的模型演化,因此重构似乎对 DDD 至关重要。当一个世界具有关系持久状态时,您可以通过更改数据库架构的迁移来处理模型更改。

在使用事件溯源时如何应对模型更改?如果对聚合有不兼容的更改会阻止事件重播,是否有某种最佳实践?还是只是不要?

【问题讨论】:

  • 我不久前在 Event Store 博客上读到了这篇有趣的帖子,也许对您有帮助:geteventstore.com/blog/20130528/why-cant-i-update-an-event
  • @JefClaes 我完全同意 Greg 的观点,操纵事件历史通常是个坏主意。但是感谢您对那篇文章的暗示,其中有一些好主意。

标签: domain-driven-design event-sourcing


【解决方案1】:

我自己没有太多经验。但是我看到了一个叫Upcasting的概念

最初是面向对象编程的概念,其中:“子类在需要时自动转换为它的超类”,向上转换的概念也可以应用于事件溯源。向上转换事件意味着将其从其原始结构转变为新结构。与 OOP 向上转换不同,事件向上转换不能完全自动化完成,因为旧事件不知道新事件的结构。必须提供手动编写的 Upcasters 来指定如何将旧结构向上转换为新结构。

您可以参考Axon's doc了解更多详情

【讨论】:

  • +1 用于指向这些文档,将答案设置为 MikeSW 的详细信息
【解决方案2】:

如果对聚合有不兼容的更改会阻止事件重放

在这种情况下,您基本上有两种选择:

  • 修补旧事件,使其兼容并且可以从头开始重播事件。这样做的好处是您不会丢失历史记录,但缺点是您必须花费一些精力来修补旧事件。
  • 在架构更改时获取聚合的快照/备忘录,并从此时开始“重新构建”事件流。这样做的好处是您不必花费任何精力(通过事件溯源,您很可能拥有一个快照机制)。缺点是您无法重播快照之前的事件。

作为一般经验法则,我会说默认为第二个选项,除非您确定需要能够在架构更改之前返回并编辑历史记录。

【讨论】:

  • +1 用于提及这些概念。以我目前对 ES 的理解,我宁愿避免将事件存储的第一个解决方案视为只读事件流。最迟如果你想出了加密链接事件以防止事件链中的操作的想法,这将是不可能的:-)——不是说我现在想这样做。使用快照似乎朝着一个好的方向发展。如果您还保留重播旧事件(版本化事件类?)的选项,我认为您应该能够访问我认为的整个历史......
【解决方案3】:

事件只是 DTO。只要您仍然拥有一个对象,如果事件本身没有改变,模型如何改变都没有关系。如果您需要更改事件,您可以使用所需的属性“升级”它。 Apply 方法将知道如何处理它。在不了解细节的情况下,我无法提出具体的建议。

如果模型变化如此之大,以至于基本上现在您有 2 个聚合根 (AR) 而不是之前的一个,这意味着您有新的不同聚合,它们不会使用旧事件。基本上,您从旧的 AR 开始,创建新的 AR 并生成特定于这些 AR 的相应事件。因此,在这种情况下,您并没有真正遇到兼容性问题。

使用事件不像“经典”OOP 和 RDBMS 模式那样简单,但如果您从业务角度考虑并将对象视为域概念,它们会更加灵活。更改模型意味着业务概念的定义或用法也发生了变化,因此现在您正在处理一个不同的(就持久性而言是新的)概念。

【讨论】:

  • +1 这是一个重要的概念。如果领域事件本质上更具语义性,那么对领域模型的更改(以及因此事件的解释方式)更有可能不会产生连锁反应。 “更改模型意味着业务概念定义或用法也发生了变化” 不过,鉴于Refactoring towards deeper insight 的重要性,我不一定同意这一点。
  • 感谢 MikeSW,我现在发现了一个类似的讨论 here,作者建议使用 Google 的 Protobuf,就像他在 here 一样。我想到了“不兼容”的变化,比如从事件中删除一个字段。我想我必须在实际使用情况下考虑它。
  • @mdo:文章“为什么选择事件溯源?” Rinat Abdullin 的作者已移至 abdullin.com/post/event-sourcing-why,他的“事件溯源 - 版本控制”已移至 abdullin.com/post/event-sourcing-versioning
猜你喜欢
  • 2021-07-25
  • 2015-08-29
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 2016-09-29
  • 1970-01-01
  • 2016-09-26
  • 2011-10-06
相关资源
最近更新 更多