使用回滚进行事件聚合器错误处理

时间:2013-08-23 13:28:43

标签: events exception-handling event-handling domain-driven-design eventaggregator

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

我担心的一个问题是:如果出现错误,如何回滚操作?

例如:

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

我应该缓存先前处理的事件并触发一个新的错误事件,该事件会查找缓存中的“撤消”操作吗?为此使用类似命令模式的东西?

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

修改

我开始认为可能会将事件用于较少的“关键任务”项目,例如电子邮件和日志记录。

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

在此特定方案中,您可以将事件推送到队列中,该队列将在您的事务中登记,以便除非保留聚合,否则事件将永远不会消失。这将使创建PDF最终一致;如果创建PDF失败,您可以解决问题,并自动重试。

也许你可以在eventual consistent domain events with RavenDB and IronMQ之前的一篇文章中获得更多灵感。