Domain driven design 快照/纪念品模式的持久性

Domain driven design 快照/纪念品模式的持久性,domain-driven-design,cqrs,memento,Domain Driven Design,Cqrs,Memento,我知道聚合根通常会重播所有事件以使自己处于正确的状态。这可能会变得效率低下,因此人们建议使用memento模式来创建聚合根的快照。我的理解是域模型与持久性无关。我还认为快照与读取模型无关。有人能这么客气地指出快照通常保存在哪里吗?谢谢。有很多方法可以做到这一点,具体取决于您用于存储事件的实现 大多数抽象的事件存储库(那些使用不可知持久性存储的人,比如MySQL、MongoDB、Redis等等)通常会自己完成 如果实现自己的机制,则可以提供快照服务和快照策略 例如,您可能希望为每个事件或每n个修订

我知道聚合根通常会重播所有事件以使自己处于正确的状态。这可能会变得效率低下,因此人们建议使用memento模式来创建聚合根的快照。我的理解是域模型与持久性无关。我还认为快照与读取模型无关。有人能这么客气地指出快照通常保存在哪里吗?谢谢。

有很多方法可以做到这一点,具体取决于您用于存储事件的实现

大多数抽象的事件存储库(那些使用不可知持久性存储的人,比如MySQL、MongoDB、Redis等等)通常会自己完成

如果实现自己的机制,则可以提供快照服务和快照策略

例如,您可能希望为每个事件或每n个修订创建一个快照

另一个解决方案是让EventStore实现在一些管道上发布事件,您可以订阅这些管道并异步构建快照

您还可以不时运行计划任务以生成快照

如果您使用EventStore持久性存储,它是一个内置的事件存储,那么您可能不需要快照,而且您很可能会使用投影来构建事件流的计算状态

作为一般建议,快照有缺点。 通过使用它,您正在使用状态持久性,而不是事件序列。 确保您确实需要它,并且没有更好的解决方案来优化您的性能


事件通常是smalls messages对象,加载速度很快。

我的答案已被删除,因此,正如建议的那样,我将以注释的形式重复回答:持久性(包括在memento模式中持久化快照)是存储库的责任。几个开源事件源代码框架向您展示了如何做到这一点,例如NEventStore或Axon。