代码之家  ›  专栏  ›  技术社区  ›  Mohsen

可以删除域事件吗?

  •  0
  • Mohsen  · 技术社区  · 7 年前

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

    2 回复  |  直到 7 年前
        1
  •  1
  •   VoiceOfUnreason    7 年前

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

    你可能想复习一下 Reliable Messaging Without Distributed Transactions ,作者:Udi Dahan;也是Pat Helland的论文 Life Beyond Distributed Transactions .

    在事件源系统中,意味着域事件的历史

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

    在一个系统中,如果您不能确定所有使用者都收到了域事件(因为使用者列表可能不明确),那么您可能无法删除域事件。

    您可以将它们移动——也就是说,您可以将事件历史的显式订阅移动到聚合,然后将隐式订阅移动到历史,而不是对聚合进行隐式订阅。

    你呢 能够将域事件的记录视为一个缓存——如果合作伙伴在消息可用的7天内没有消费完消息,那么消息的传递可能不是系统中最大的问题。

    你们需要多少个9的交货保证?

        2
  •  1
  •   choquero70    7 年前

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

    不应从事件存储中删除域事件。如果您想知道您之前是否已经处理过它,您可以添加一个标志来知道它。

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

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

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

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

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

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