1

我一直在研究开发人员在领域驱动设计上设计/构建应用程序的许多常用方法(仍在尝试从整体上理解这个概念)。我看到的一些示例包括通过事件聚合器使用事件。我喜欢这个概念,因为它真正使应用程序的不同元素/域保持分离。

我担心的是:在发生错误的情况下如何回滚操作?

例如:

假设我有一个订单应用程序,它必须将订单保存到数据库,并将订单的副本以 pdf 格式保存到 CMS。应用程序会触发一个新订单已创建的事件,并且订阅此事件的 pdf 服务会保存该 pdf。同时,在将订单更改提交到数据库时,会引发异常。问题是 pdf 已保存,但它们不是匹配的数据库记录。

我是否应该缓存以前处理的事件并触发一个新的错误事件来查找缓存以进行“撤消”操作?为此使用类似命令模式的东西?

或者......事件聚合器不是一个好的模式。

编辑

我开始认为也许应该将事件用于不太“关键任务”的项目,例如电子邮件和日志记录。

我最初的想法是通过使用事件聚合器模式来限制依赖关系。

4

2 回答 2

2

您希望事件在与数据库操作相同的事务中提交。

在这个特定的场景中,您可以将事件推送到队列中,该队列在您的事务中登记,这样事件将永远不会消失,除非聚合被持久化。这将使创建的 PDF 最终保持一致;如果创建 PDF 失败,您可以修复问题,然后自动重试。

也许您可以在我之前关于RavenDB 和 IronMQ 的最终一致域事件的一篇文章中获得更多灵感。

于 2013-08-23T17:05:11.037 回答
2

在事件实际发生(提交)之前处理事件仅在事件处理程序参与事务时才有效。使事件处理程序具有事务性(例如通过将 PDF 存储在数据库中),或在事务提交后发布和处理事件。

于 2013-08-23T13:58:52.020 回答