事件采购:处理事件架构更改

时间:2018-02-01 14:10:51

标签: java-ee apache-kafka event-sourcing

软件项目不断发展。然后,事件采购架构支持的应用软件不断发展。

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

因此,Event Sourcing arquitecture提供的好处之一是它能够重播所有活动"并从旧事件中建立一个当前状态。

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

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

4 个答案:

答案 0 :(得分:4)

  

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

设计。在确定事件模式时,您将向后兼容性作为一流的关注点,并且您尽早做到这一点,以便以后的更改很容易。

Greg Young见Versioning in an Event Sourced System

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

如果这还不够:您创建了一个具有更好设计的新架构,并将数据迁移到新架构。

  

您对使用schema.org有何看法?

我认为架构标识符是一个很好的起点,它们确实开辟了与域无关组件共享消息的一些细节的可能性。例如,http://schema.org/telephone是与通用演示引擎进行通信的好方法,其中所附数据适合拨号。

因此,无论如何,请在设计您的架构时考虑到这些类型,并尽可能与它们保持一致。

但是当你分歧时,给你的架构一个新的标识符。

答案 1 :(得分:3)

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

  1. 版本化事件:永远不会更改现有事件,始终引入新事件。
  2. 弱模式:优雅地处理缺少的属性或多余的属性。
  3. Upcasters:在应用程序处理它们之前,在运行时转换事件。
  4. 就地转型:只需更改商店中需要更改的内容。
  5. 复制转换:将整个商店复制到新商店。
  6. 这些都在我们的论文"事件采购的黑暗面" (https://www.movereem.nl/files/2017SANER-eventsourcing.pdf

    我们还研究了周边地区:

    • 修剪您的活动商店以保持大小可维护。
    • 如何让您的阅读模型保持同步。
    • DDD如何帮助您防止架构演变。

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

答案 2 :(得分:1)

  

如果我需要更改事件架构(事件类型),添加或删除属性或更改属性的语义,那该怎么办?

Use Avro!可以添加,修改,删除字段时a well defined evolution process。您可以将其视为JSON的更紧凑版本,并且它支持所有主要编程语言。

您可以将其与Confluent Platform的Avro Schema Registry配对,这样您就可以获得数据模式的真实性和验证来源。此外,您可以使用Kafka Avro SerDes管理主题中的Kafka消息模式。

答案 3 :(得分:0)

<块引用>

对于如何处理这种情况有什么想法吗?

简短的回答是采用事件版本控制和特定的迁移过程。请记住,这是两个不同的问题,尽管相关。

较长的答案在 the following article 中。

希望能帮到你,加油