领域驱动设计和领域事件

7
我是DD​​D的新手,正在阅读文章以获取更多信息。其中一篇文章专注于域事件(DE)。例如,在执行某些代码后,发送电子邮件就是引发的一个域事件,因为满足一些条件。
代码示例展示了一种处理域事件的方式,后面跟着这段话:
请注意,上面的代码将在与常规域工作相同的事务中的同一线程上运行,因此您应避免执行任何阻塞活动,例如使用SMTP或Web服务。而是,应优先使用单向消息传递来与执行这些阻塞活动的其他组件通信。
我的问题是:
1.处理DE时,这是一般性的问题吗?还是只是提到的解决方案的问题?
2.如果在交易中引发域事件且系统不会同步处理它们,应如何处理它们?
3.当我决定序列化这些事件并让调度程序(或任何其他机制)执行它们时,当交易被回滚时会发生什么?(在文章中,事件在执行事务中的代码中引发)谁会取消它们(当它们未持久化到数据库时)?
谢谢
1个回答

8

这是一个普遍的问题,不要忘记DDD。

一般来说,在任何需要以高效响应的系统中(例如Web服务器),所有长时间运行的活动都应异步处理以触发过程。

这意味着需要队列。

回滚事务应将项目从队列中删除。

当然,现在您需要额外的机制来处理队列上的项目无法处理的情况 - 即电子邮件未发送 - 您还需要在触发代码中允许这种情况 - 依赖先前已发生的其他进程的后续进程会在某些时候引起问题。

简而言之,您的队列机制本身应该是可重试的事务,并且需要考虑整个事件链作为工作流。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接