软件项目不断发展。然后,事件采购架构支持的应用软件不断发展。
在更适合随时更改的事物之间是事件模式(或事件类型)。
因此,Event Sourcing arquitecture提供的好处之一是它能够重播所有活动"并从旧事件中建立一个当前状态。
如果我需要更改事件架构(事件类型),添加或删除属性或更改属性的语义,那该怎么办?到目前为止,我已经能够弄清楚当前的服务实现是不是能够处理旧事件,因为它们是某种产品(它们不包含属性,或者语义已经改变)。
关于如何处理这种情况的任何想法?
答案 0 :(得分:4)
关于如何处理这种情况的任何想法?
你设计。在确定事件模式时,您将向后兼容性作为一流的关注点,并且您尽早做到这一点,以便以后的更改很容易。
Greg Young见Versioning in an Event Sourced System。
基本思想:你永远不会改变架构元素的语义。您可以通过添加新的可选元素来扩展架构,并且可以弃用可选元素。
如果这还不够:您创建了一个具有更好设计的新架构,并将数据迁移到新架构。
您对使用schema.org有何看法?
我认为架构标识符是一个很好的起点,它们确实开辟了与域无关组件共享消息的一些细节的可能性。例如,http://schema.org/telephone
是与通用演示引擎进行通信的好方法,其中所附数据适合拨号。
因此,无论如何,请在设计您的架构时考虑到这些类型,并尽可能与它们保持一致。
但是当你分歧时,给你的架构一个新的标识符。
答案 1 :(得分:3)
这是我过去两年来一直在做的研究课题。 我们发现了5种可用于处理模式演变的技术:
这些都在我们的论文"事件采购的黑暗面" (https://www.movereem.nl/files/2017SANER-eventsourcing.pdf)
我们还研究了周边地区:
最后一部分尚未公开。但你可以在这里找到我在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 中。
希望能帮到你,加油