7

我是 DDD 的新手,我现在正在阅读文章以获取更多信息。其中一篇文章侧重于领域事件 (DE)。例如,发送电子邮件是在执行一段代码时满足某些条件后引发的域事件。

代码示例显示了一种处理域事件的方法,然后是本段

请注意,上述代码将在与常规域工作相同的事务内的同一线程上运行,因此您应避免执行任何阻塞活动,例如使用 SMTP 或 Web 服务。相反,更喜欢使用单向消息传递与执行这些阻塞活动的其他事物进行通信。

我的问题是

  1. 这是处理 DE 的普遍问题吗?或者只是提到文章中的解决方案?
  2. 如果事务中引发领域事件,系统不会同步处理,应该如何处理?
  3. 当我决定序列化这些事件并让调度程序(或任何其他机制)执行它们时,事务回滚时会发生什么?(在文章中事件在事务中执行的代码中引发)谁将取消它们(当它们没有持久化到数据库时)?

谢谢

4

1 回答 1

8

这是一个普遍的问题时期,没关系 DDD

通常,在任何需要以高性能方式响应的系统(例如 Web 服务器)中,任何长时间运行的活动都应该与触发过程异步处理。

这意味着队列。

回滚您的事务应该从队列中删除项目。

当然,您现在需要额外的机制来处理队列中的项目无法处理的情况 - 即未发送电子邮件 - 您还需要在触发代码中允许这一点 - 后续流程依赖于较早的已经发生的过程将在某些时候引起问题。

简而言之,您的排队机制本身应该是事务性的并允许重试,您需要将整个事件链视为一个工作流。

于 2011-06-08T14:24:31.430 回答