DomainEventPublisher 一致性
DomainEventPublisher consistency
刚刚阅读了 Vaughn Vernon 的 effective aggregate design,我想知道与事件发布相关的失败。
在第 9 页(PDF 的第 3 页)的给定示例中,我们调用 DomainEventPublisher.publish()
。发布的事件允许其他聚合执行它们的行为。
我想知道的是:如果 DomainEventPublisher.publish()
失败会怎样?如果 DomainEventPublisher.publish()
成功,但交易失败会怎样?
实现如何处理这两种情况?
What happens if DomainEventPublisher.publish() succeeds, but the
transaction fails?
在这种情况下,我反对弗农的做法。我更喜欢 return the events 而不是应用程序服务。这样我就可以使用事务(如果需要)持久化聚合执行的更改,如果一切正常,我将发布该事件。这也有助于保持业务层完全干净和纯净。
简而言之;如果交易失败,则不会引发任何事件。
What happens if DomainEventPublisher.publish() fails?
根据业务规则,领域事件永远不会失败,因为它是对已发生事情的通知。如果聚合对操作说是并且 return 表示业务更改的事件;那么世界上没有什么应该说这个操作不能完成或必须撤消。
如果事件因基础设施而失败,那么您需要有工具在中断修复后(自动或手动)重新引发它,并最终将一致性存档在您的系统中。看看NServiceBus。它提供重试、错误队列、日志等,以永不丢失事件。
如果消息系统出现故障,您至少可以使用事件日志将它们重新添加到消息系统中。
DomainEventPublisher.publish()
是同步的。您将设置一个 generic handler (handles all events) 将事件存储在 与业务流程相同的数据库事务 中,这意味着您的事件存储必须能够与任何其他存储进行事务处理您用来存储聚合状态的机制。
事件以事务方式写入磁盘后,您就可以将它们放入消息队列中进行异步传递。
Are there other known ways to do it?
好吧,与其使用静态 DomainEventPublisher
,不如在 AR 上的集合中记录事件,就像在事件溯源中一样,然后实施集中式机制来存储它们(例如事务挂钩、使用方面、等)。
刚刚阅读了 Vaughn Vernon 的 effective aggregate design,我想知道与事件发布相关的失败。
在第 9 页(PDF 的第 3 页)的给定示例中,我们调用 DomainEventPublisher.publish()
。发布的事件允许其他聚合执行它们的行为。
我想知道的是:如果 DomainEventPublisher.publish()
失败会怎样?如果 DomainEventPublisher.publish()
成功,但交易失败会怎样?
实现如何处理这两种情况?
What happens if DomainEventPublisher.publish() succeeds, but the transaction fails?
在这种情况下,我反对弗农的做法。我更喜欢 return the events 而不是应用程序服务。这样我就可以使用事务(如果需要)持久化聚合执行的更改,如果一切正常,我将发布该事件。这也有助于保持业务层完全干净和纯净。
简而言之;如果交易失败,则不会引发任何事件。
What happens if DomainEventPublisher.publish() fails?
根据业务规则,领域事件永远不会失败,因为它是对已发生事情的通知。如果聚合对操作说是并且 return 表示业务更改的事件;那么世界上没有什么应该说这个操作不能完成或必须撤消。
如果事件因基础设施而失败,那么您需要有工具在中断修复后(自动或手动)重新引发它,并最终将一致性存档在您的系统中。看看NServiceBus。它提供重试、错误队列、日志等,以永不丢失事件。 如果消息系统出现故障,您至少可以使用事件日志将它们重新添加到消息系统中。
DomainEventPublisher.publish()
是同步的。您将设置一个 generic handler (handles all events) 将事件存储在 与业务流程相同的数据库事务 中,这意味着您的事件存储必须能够与任何其他存储进行事务处理您用来存储聚合状态的机制。
事件以事务方式写入磁盘后,您就可以将它们放入消息队列中进行异步传递。
Are there other known ways to do it?
好吧,与其使用静态 DomainEventPublisher
,不如在 AR 上的集合中记录事件,就像在事件溯源中一样,然后实施集中式机制来存储它们(例如事务挂钩、使用方面、等)。