我正在寻找一种方法,将事件日志最小化为最小数量的事件,以重新创建最新状态。举个例子,如果下面的事件列表代表了一个简单的Todo应用程序中发生的一切:
TodoCreated(1)
TodoTextUpdated(1,"Buy milch")
TodoCreated(2)
TodoTextUpdated(1,"Buy milk")
TodoRemoved(2)
我不希望所有的消费者看到所有中间步骤,我想将它们最小化为以下事件
TodoCreated(1)
TodoTextUpdated(1,"Buy milk")
两个事件列表都会导致相同的结束状态。
它是否存在一般的算法,或者您是否必须根据具体情况对此进行编程?
答案 0 :(得分:1)
这是您需要根据具体情况处理的问题。
修改事件与采购事件的精神背道而驰。退出CRUD域并开始处理具有实际业务语义的域事件时尤其如此。
BUT
没有人说你必须分享真实的"与您的客户的事件流。你可以,例如:
1)在每批事件之后建立对象的当前状态,并与客户分享"最新"国家,没有它背后的历史。
2)读取一批事件,计算更改,并在客户端流上发布补丁事件
3)客户端流中的审查事件(他们可以看到一些正在发生的事情,但还不足以实际重新创建对象状态。 4)正如您最初暗示的那样,尝试进行对帐和合并。
您可能想查看Greg Young关于Occassionally Connected系统的演讲。在其中,他描绘了一种比较事件以检测冲突命令的方法。您可能需要类似的东西来检测系统中哪些事件被单独的事件覆盖/隐藏。在格雷格的例子中,他们在这里所做的工作中获得了很多商业价值,所以也许值得考虑。