domain-driven-design - 领域驱动设计和领域事件

标签 domain-driven-design domain-events

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

代码示例展示了一种处理领域事件的方法,后面跟着这一段

Please be aware that the above code will be run on the same thread within the same transaction as the regular domain work so you should avoid performing any blocking activities, like using SMTP or web services. Instead, prefer using one-way messaging to communicate to something else which does those blocking activities.



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

  • 谢谢

    最佳答案

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

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

    这意味着排队。

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

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

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

    关于domain-driven-design - 领域驱动设计和领域事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6280214/

    相关文章:

    c# - 延迟验证

    c# - 具有持久性无知对象的持久性和领域事件

    java - 如何将领域模型与 REST 模块分离?

    c# - 数据库中有 1000 多个 Linq 查询或逻辑……哪个更糟?

    json - SQL 中的领域事件存储...使用 JSON 序列化?

    c# - 在 C# 中对域事件进行排队

    domain-driven-design - 在事件溯源中命名事件类型的最佳实践

    design-patterns - 如何从现有的写入数据库生成 CQRS 中的读取数据?

    entity-framework - 域事件中的新实体 ID

    java - 聚合到 JPA 实体映射