域驱动设计和域事件

时间:2011-06-08 14:18:40

标签: domain-driven-design domain-events

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

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

  

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

我的问题是

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

1 个答案:

答案 0 :(得分:8)

这是一个普遍的问题时期,不要介意DDD

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

这意味着队列。

回滚您的交易应该从队列中删除项目。

当然,您现在需要其他机制来处理队列中的项目无法处理的情况 - 即电子邮件未发送 - 您还需要在触发代码中允许此操作 - 具有后续进程RELY已经发生的早期过程将在某个时刻引起问题。

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