事件源:处理事件模式更改

Jor*_*rdi 7 java-ee event-sourcing apache-kafka

一个软件项目在发展。然后,在事件源体系结构上受支持的应用程序软件随之发展。

事件模式(或事件类型)之间最适合随时间更改的事物之间。

因此,Event Sourcing arquitecture提供的好处之一是它能够“重播所有事件”并根据旧事件建立当前状态。

如果我需要更改事件模式(事件类型),添加或删除属性或更改属性的语义该怎么办?到目前为止,我已经能够弄清楚当前的服务实现将无法处理旧事件,因为它们是某种过时的(它们不包含属性,或者语义已更改)。

关于如何处理这种情况的任何想法?

Voi*_*son 6

关于如何处理这种情况的任何想法?

您为它设计。确定事件模式时,首先要考虑向后兼容性,并且尽早做好,以便以后进行更改很容易。

请参阅Greg Young 的“事件源系统中的版本控制”

基本思想:您永远不会改变架构元素的语义。您可以通过添加新的可选元素来扩展架构,并且可以弃用可选元素。

如果这还不够:您可以使用更好的设计创建新的架构,然后将数据迁移到新的架构。

您对使用schema.org有什么看法?

我认为模式标识符是一个很好的起点,并且确实为与域不可知的组件共享消息的某些细节提供了可能性。例如,这http://schema.org/telephone是一种与通用表示引擎进行通信的好方法,其中所包含的数据适合于拨号。

因此,无论如何,在设计模式时请牢记这些类型,并尽可能与它们保持一致。

但是当您发散时,请为您的架构提供新的标识符。


Mic*_*eem 5

这是我过去两年中一直在做的研究主题。我们发现了5种可用于处理模式演变的技术:

  1. 版本化事件:永远不要更改现有事件,总是引入新事件。
  2. 弱模式:妥善处理丢失的属性或多余的属性。
  3. Upcasters:在应用程序必须处理事件之前,在运行时转换事件。
  4. 就地转换:只需更改您需要在商店中更改的内容。
  5. 复制转换:将整个商店复制到新商店。

我们的论文“事件采购的阴暗面”(https://www.movereem.nl/files/2017SANER-eventsourcing.pdf)中对此进行了总结。

我们还研究了周围地区:

  • 修剪事件存储区以保持大小可维护。
  • 如何使您的读取模型保持同步。
  • DDD如何帮助您防止架构演变。

最后一部分尚未公开。但是您可以找到我昨天在DDDEurope上发表的演讲的幻灯片:https ://speakerdeck.com/overeemm/dddeurope-2018-event-sourcing-after-launch