事件溯源:忽略事件的正确方法
Event sourcing: correct approach to ignore events
我目前正在从事一个使用事件溯源的项目。这是我第一次使用 ES,因此有时我不知道我用来解决某些问题的方法是否正确。
考虑这种情况:我有一个基于 UI 的任务,其中每个操作都会产生一个命令,该命令会创建一个或多个事件。
在某一时刻,用户可以启动一个进程,比如说生成一个名为 ProcessStarted
的事件。从那里他将能够对聚合进行更改,从而产生其他事件。
他可以继续,或者,如果他愿意,他可以恢复聚合在他开始上述过程之前的最后一个事件的状态,假设生成了一个名为 ProcessReverted
的事件。
如果回滚流程,可以对聚合进行更多的操作,但是从ProcessStarted
到ProcessReverted
事件的流程中并发的事件一定不能考虑。
因此,当聚合体重新水化时,我想要:
- 从时间开始的所有事件都要考虑;
- 从
ProcessStarted
到 ProcessReverted
事件的所有事件都将被忽略;
- 要考虑
ProcessReverted
事件之后的所有事件。
实现我的目标的最佳方法是什么?我想不出一个优雅且适合 ES 上下文的解决方案。
我不会在这里发布任何代码,因为我不是在寻找实现细节,而是在寻找一种策略,我希望从比我更有经验的人那里得到一些建议,我希望这会帮助我更好地理解如何利用 ES 的强大功能和灵活性。
您应该在聚合中执行此操作,方法是在每次应用 ProcessStarted
事件时存储状态快照;当应用 ProcessReverted
时,整个状态将替换为快照中保存的状态。这很简单,因为事件总是按照它们发出的顺序应用。
因此,不需要外部组件或基础设施服务,它只是内部聚合逻辑。
我目前正在从事一个使用事件溯源的项目。这是我第一次使用 ES,因此有时我不知道我用来解决某些问题的方法是否正确。
考虑这种情况:我有一个基于 UI 的任务,其中每个操作都会产生一个命令,该命令会创建一个或多个事件。
在某一时刻,用户可以启动一个进程,比如说生成一个名为 ProcessStarted
的事件。从那里他将能够对聚合进行更改,从而产生其他事件。
他可以继续,或者,如果他愿意,他可以恢复聚合在他开始上述过程之前的最后一个事件的状态,假设生成了一个名为 ProcessReverted
的事件。
如果回滚流程,可以对聚合进行更多的操作,但是从ProcessStarted
到ProcessReverted
事件的流程中并发的事件一定不能考虑。
因此,当聚合体重新水化时,我想要:
- 从时间开始的所有事件都要考虑;
- 从
ProcessStarted
到ProcessReverted
事件的所有事件都将被忽略; - 要考虑
ProcessReverted
事件之后的所有事件。
实现我的目标的最佳方法是什么?我想不出一个优雅且适合 ES 上下文的解决方案。
我不会在这里发布任何代码,因为我不是在寻找实现细节,而是在寻找一种策略,我希望从比我更有经验的人那里得到一些建议,我希望这会帮助我更好地理解如何利用 ES 的强大功能和灵活性。
您应该在聚合中执行此操作,方法是在每次应用 ProcessStarted
事件时存储状态快照;当应用 ProcessReverted
时,整个状态将替换为快照中保存的状态。这很简单,因为事件总是按照它们发出的顺序应用。
因此,不需要外部组件或基础设施服务,它只是内部聚合逻辑。