【问题标题】:DDD and messages for Aggregates communication聚合通信的 DDD 和消息
【发布时间】:2021-01-28 22:38:57
【问题描述】:

我正在使用带有 Spring Boot 和 mongodb 的 Java 中的 DDD 原则编写一个练习应用程序。根据 DDD,聚合之间的通信仅通过消息传递发生。此时我没有分发应用程序,所有聚合都驻留在同一个应用程序中,所以我只是使用 Spring 消息传递功能来交换消息。

每个聚合恰好对应一个 mongo 文档。由事件触发的每个命令或操作都由@Transactional 注释保护,以确保以原子方式处理数据库事务和事件。 我想知道我应该在哪里存储事件?我可以将它们存储在 mongo 文档中吗?实际上,由于 mongo 事务跨越单个文档,这不是唯一的选择吗?

下一步是设置一个周期性任务,它将读取所有最近的事件并发布它们以模拟离线通信。此时,存储事件的单独文档集合可能是一个好地方。

附:我暂时不考虑事件溯源,因为它似乎更高级。

谢谢!

【问题讨论】:

    标签: java mongodb domain-driven-design


    【解决方案1】:

    我想知道应该将事件存储在哪里?

    通常的思路是分布式事务很糟糕;因此,如果您可以管理它,您希望将事件与聚合状态一起存储。在 RDBMS 世界中,您的事件位于与聚合数据相同的数据库架构中的表中 - 请参阅Udi Dahan, 2014

    如果有帮助,您可以将事件消息的“发件箱”视为聚合中的另一个实体。

    此保存成功后,您将处理复制信息到需要的不同位置的问题,并注意失败模式。在这一点上,这纯粹是一个“管道”问题,也就是说,它通常被视为应用程序和基础架构问题,而不是域问题。

    【讨论】:

    • 感谢您的回复。由于 Mongo 没有跨越多个文档的事务,我试图通过在聚合和文档之间建立一对一的连接来强迫自己将聚合视为单个事务单元,并且因为我主要使用关系数据库直到现在。但是,是的,我同意这不是聚合应该解决的问题。
    • 是否有一个开箱即用的解决方案来处理接收和发送消息的原子性?参考 Udi Dahan 的介绍
    猜你喜欢
    • 2019-08-07
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 2016-11-05
    相关资源
    最近更新 更多