gpt4 book ai didi

scala - 如何处理事件源应用程序中的域更改?

转载 作者:行者123 更新时间:2023-12-01 23:12:39 25 4
gpt4 key购买 nike

我目前正在使用 Scala 和 Eventuate ,但我认为这个问题适用于任何事件源环境:

假设您有以下事件:case class UserAdded(user: User),而 Usercase class User(username:String,birthday:日期).

您的应用已经运行了一段时间,现在您需要收集用户的电话号码。所以现在我们需要将 User 更改为 case class User(username:String, birthday: Date, phoneNumber: String)

重播事件时,会抛出错误,因为过去的事件没有phoneNumber。您通常如何在事件源应用程序中解决这个问题?

我的第一个想法是为事件存储中的所有事件设置一个默认值,但我知道在进行事件溯源时事件是不可变的,因此我决定听取更有经验的用户的意见。

非常感谢任何输入!

最佳答案

我认为这里有两个概念错误。

首先,事件不应“引用”或“包含”域对象。事件是对所发生事件的记录,因此它应该明确记录表征它的数据点。在这种情况下 - usernamebirthday:

case class UserAdded(username:String, birthday: Date)

现在,这个事件定义永远不会改变。发生了什么,发生了。没有改写过去。

如果在某个时刻业务需求发生变化,这意味着从现在开始会发生一种不同的事件:

case class UserAdded2(username:String, birthday: Date, phoneNumber: String)

这两个事件都应该保持原样,都应该被处理、处理等等。正如直觉所暗示的那样,第一个事件并非“现在无用”。恰恰相反:第一个事件记录了需求更改之前发生的事情,并且该记录很有值(value)。

现在,根据您的平台允许的情况(我对 Eventuate 不熟悉),您或许可以在技术上将这两个事件实现为具有可选字段的单个类。但即使你这样做了,你也应该永远记住这个类代表两个不同的事件。出于这个原因,我宁愿将它们明确定义为单独的事物。

关于scala - 如何处理事件源应用程序中的域更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44771815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com