首页 > 解决方案 > 聚合通信的 DDD 和消息

问题描述

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

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

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

PS 我暂时不考虑事件溯源,因为它似乎更先进。

谢谢!

标签: javamongodbdomain-driven-design

解决方案


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

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

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

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


推荐阅读