压缩或最小化事件日志

Squash or minimize an event log

我正在寻找一种方法将事件日志最小化为最少的事件数以重新创建最新状态。举个例子,如果下面的事件列表代表了一个简单的待办事项应用程序中发生的一切:

TodoCreated(1)
TodoTextUpdated(1,"Buy milch")
TodoCreated(2)
TodoTextUpdated(1,"Buy milk")
TodoRemoved(2)

我不希望我的所有消费者都看到所有中间步骤,我想将它们最小化为以下事件

TodoCreated(1)
TodoTextUpdated(1,"Buy milk")

两个事件列表将导致相同的结束状态。

是否存在针对此问题的通用算法,或者您是否必须针对具体情况进行编程?

这个问题你需要根据具体情况来处理。

修改事件违背了事件溯源的本意。当您离开 CRUD 域并开始使用具有实际业务语义的域事件时尤其如此。

但是

没有人说您必须与客户共享 "real" 事件流。例如,您可以:

1) 在每批事件之后构建对象的当前状态,并与客户端共享 "latest" 状态,没有它背后的历史。

2) 读取一批事件,计算变化,并在客户端流上发布补丁事件

3) 从客户端流中审查事件(他们可以看到一些正在发生的事情,但不足以实际重新创建对象状态。 4) 尝试协调和合并,正如您最初暗示的那样。

您可能想回顾一下 Greg Young 关于 Occassionally Connected 系统的演讲。在其中,他概述了一种比较事件以检测冲突命令的方法。你会想要类似的东西,通过一个单独的事件来检测你系统中的哪些事件是 covered/hidden。在 Greg 的例子中,他们从他们在这里所做的工作中获得了很多商业价值,所以也许值得考虑。