【问题标题】:Snapshotting as Domain Event in Event Sourcing在事件溯源中将快照作为领域事件
【发布时间】:2018-12-08 21:30:36
【问题描述】:

我的事件溯源模型中有一些相当恒定的聚合,它们会累积大量事件。我正在考虑使用快照来优化这些聚合体的再水合。 IE。聚合体是仓库。

我的问题是我是否应该为快照生成特定事件,例如“WarehouseStateSnapshotted”。在我当前的原型中,快照状态保存在几个命令处理程序中存在的重复代码中。我觉得这不是处理它的正确区域。我宁愿将快照的事件分派到我的服​​务总线,并让事件处理程序处理保存快照状态。 然而,这可能违反了他们自己的领域驱动的事件模式。 有其他人为快照创建的事件吗?

如果这不是正确的方法,我是否应该至少将我的快照逻辑从命令处理程序中移到聚合类中?

谢谢!

编辑: 标题和 -- This 评论似乎暗示了快照,因为域事件是错误的方法。

EDIT2: 简化问题 - 将 repos 注入命令处理程序是否合适?

【问题讨论】:

  • 将存储库注入命令处理程序将取决于您的命令处理程序所在的位置。如果您的意思是处理命令的聚合方法,那么不,不要注入存储库。我建议将相关值传递给方法。然而,如果命令处理程序是一个服务总线消息处理程序(集成层),那么它绝对没问题,因为真的没有其他方法 :)
  • 嗯,好的。我的命令处理程序是总线上使用 mediatR 的消息,其中每个都调用相关的聚合处理程序来更改状态。我相信这是正确的做法。

标签: event-handling domain-driven-design cqrs snapshot event-sourcing


【解决方案1】:

让我先攻击简单的。快照逻辑不属于聚合。是否以及何时执行 shapshot 纯粹是性能问题,因此不属于业务规则。通过想象具有无限资源的服务器来帮助划清界限。如果你不需要在这台神奇的机器上做“事情”,那么“事情”就不属于聚合体。

在您在上面发布的链接中,我同意 RBanks54 的观点,即由于他列出的所有原因,快照不属于聚合事件流。我认为您在服务总线上调度事件,然后在不同命令中处理该事件的解决方案是正确的方法。在处理新事件的上下文中处理快照意味着除非收到新事件,否则您无法进行快照。在服务总线上拥有不同的消息意味着任何进程都可以在适当的时候请求快照。

【讨论】:

  • 这是一个很好的观点,其他进程应该能够触发快照而不仅仅是事件。谢谢!
【解决方案2】:

我一直在涉足事件溯源,但我不是专家。我不太喜欢用单独的“stream”来表示快照的想法。它不是一个流,因为它只存储最后一个快照。在我仍处于起步阶段的Shuttle.Recall 项目中,我将快照存储为普通域事件,但它们被特别标记为快照,并且最后一个快照版本单独存储以便加载它,然后应用该版本之后的事件.我发现这样做的一些优势在于您还可以围绕快照添加一些功能。

当您将快照用作纯粹的技术性能改进时,它可能不会为您的域增加太多价值。如果快照不属于聚合/域,那么如何从快照中水合聚合?

在某些情况下,快照可能是域的很大一部分。当您查看您的每月银行对帐单时,您不会发现从您开设账户之日起的每一笔交易(事件)。相反,我们有一个包含该月新交易(事件)的期初余额(快照)。这样,“MonthEndProcessed”事件很可能是一个快照。

我也不真的购买如果快照包含错误而您无法修复它的论点,因为事件流是不可变的。如果您的事件包含错误会发生什么?你能不修吗?理想情况下,这些错误不应进入生产系统,但如果出现,则应予以修复。无论如何,对我来说,不变性与与系统的典型交互有关。我们通常不会在事件发生后对其进行更改。

在某些情况下,返回并将某些事件更改为较新的版本甚至可能是有益的。这些应该保持在最低限度,最好避免,但在某些情况下可能是务实的。

但就像我说的......我还在学习:)

【讨论】:

  • 我喜欢这个答案。其他域,例如 Medium.com 等故事分享平台,可能需要将快照作为其域的一部分来支持故事修订。
【解决方案3】:

我的问题是我是否应该为快照生成特定事件,例如“WarehouseStateSnapshotted”。

“视情况而定”。

您应该查看快照的参考是 CQRS Documents,作者是 Greg Young。这是相对较旧的 2010 年,但可以作为快照概念的简单介绍。

异步生成快照并将它们存储在事件流之外没有任何问题。

您可以在快照过程中使用任何合理的触发器;您不一定需要流中的事件。 “每 100 个事件快照”或“每 10 分钟快照”或“管理员单击快照按钮时的快照”都是可行的。

某些域对它们有一种自然的节奏,域本身可能会暗示一个快照——想想“在财政年度结束账目”。

我对将与域无关的“制作快照”消息放入事件流中有些怀疑 - 我认为让聚合负责快照节奏是不合适的。它没有损坏,但确实有点像用不同的关注点重载事件流的语义。

【讨论】:

    猜你喜欢
    • 2021-07-25
    • 2015-08-29
    • 2022-10-23
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 2021-12-23
    相关资源
    最近更新 更多