【问题标题】:Can domain events be deleted?可以删除域事件吗?
【发布时间】:2018-09-16 12:59:29
【问题描述】:

为了使域事件处理一致,我想在保存AggregateRoot 的同时将域事件持久化到数据库中。稍后使用事件处理器对它们做出反应,例如假设我想将它们作为集成事件发送到事件总线,我想知道在通过总线后是否允许从数据库中删除事件? 因此,事件将永远不会再以 AggregateRoot 根目录加载。

【问题讨论】:

    标签: domain-driven-design eventual-consistency domain-events


    【解决方案1】:

    我想知道是否允许reactor在反应之后从db中删除事件。

    您可能想要查看 Udi Dahan 的 Reliable Messaging Without Distributed Transactions;还有 Pat Helland 的论文Life Beyond Distributed Transactions

    在事件源系统中,这意味着域事件的历史聚合的持久历史,您几乎永远不会删除事件。

    在一个系统中,域事件日志只是要与其他“伙伴”通信的消息日志:从根本上说,域事件是描述要从系统的一个部分复制到另一个部分的信息的消息。因此,当我们收到消息已成功复制的确认时,我们可以删除存储在“此处”的副本。

    在您无法确定所有消费者都收到了域事件的系统中(因为消费者列表可能不明确),那么您可能无法删除域事件。

    您也许可以移动它们——也就是说,您可以从事件历史中显式订阅聚合,然后隐式订阅历史,而不是隐式订阅聚合。

    可能能够将域事件记录视为缓存 - 如果合作伙伴在消息可用后 7 天内未完成使用消息,那么可能会交付消息不是系统中最大的问题。

    您需要多少个九的交货保证?

    【讨论】:

      【解决方案2】:

      领域事件是过去发生的事情。你不能删除过去,假设你不是 Martin McFly :)

      不应从事件存储中删除域事件。如果想知道之前是否已经处理过,可以加个flag知道。

      更新 ==> 事件管理流程说明

      我遵循 IDDD(Vaughn Vernon 的红皮书,参见第 287 页的图片)的方法:

      1)聚合将事件本地发布到BC(轻量级发布者)。

      2) 在 BC 中,轻量级订阅者将 BC 发布的所有事件存储在“事件存储”(即 BC 同一个数据库中的表)中。

      3) 批处理(工作者)读取事件存储并将事件发布到消息队列(或您所说的事件总线)。

      4) 其他对事件感兴趣的 BC(甚至是同一个 BC)订阅消息队列(或事件总线)以监听事件并对事件做出反应。

      无论如何,即使工作人员已经将事件发送到消息队列中,您也不应该从事件存储中删除域事件。相反,不要再发送它,但事件是已经发生的事情,您不能(不应该)删除过去发生的事情。

      消息队列或事件总线只是一种发送/接收事件的机制,但事件应保持存储在它们创建和发布的 BC 中。

      【讨论】:

      • 聚合根不是此处的事件源,根据定义,当事件通过可靠的测量代理时,聚合根将不再需要它。对我来说,仍然存在一个令人生疑的问题是此类事件应该由聚合根生成还是应用服务生成。
      • @Mohsen 我不明白你的意思。我一直认为不应该删除域事件。请参阅我的更新答案。
      • @Mohsen 我认为您的方法与我的不同,您不会将事件保存在单独的事件表中,而是使用聚合根,对吗?我不知道在这种情况下哪种方式可以继续,但是关于您评论中的最后一个问题,如果事件是由应用程序服务生成的,那么它不是域事件,我不知道如何管理。 DDD谈领域事件,DDD不定义应用服务事件
      • 是的,但是volatile事件(发布后应该被遗忘的事件)可以由聚合根生成吗?
      • 好吧,如果您不想将它们保存在磁盘中,请进行备份。无论如何,考虑到这个问题,我认为如果您想删除您已确认已交付的事件,请将其删除。我认为你不应该,但我不认为删除它的事实使它不是域事件。只是将来您将无法重建聚合状态,或者出于任何原因需要重新引发事件。但是,如果您可以忍受这一点,我认为删除该事件并不会窃取它作为领域事件存在时的荣誉。问候。
      猜你喜欢
      • 2013-06-19
      • 2010-12-06
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多