首页 > 解决方案 > 可以删除域事件吗?

问题描述

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

标签: domain-driven-designeventual-consistencydomain-events

解决方案


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

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

更新 ==> 事件管理流程描述

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

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

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

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

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

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

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


推荐阅读