java - 聚合通信的 DDD 和消息
问题描述
我正在使用带有 spring boot 和 mongodb 的 java 中的 DDD 原则编写一个练习应用程序。根据 DDD,聚合之间的通信仅通过消息传递发生。此时我没有分发应用程序,所有聚合都驻留在同一个应用程序中,所以我只是使用 Spring 消息传递功能来交换消息。
每个聚合恰好对应一个 mongo 文档。由事件触发的每个命令或操作都由@Transactional 注释保护,以确保以原子方式处理数据库事务和事件。我想知道我应该在哪里存储事件?我可以将它们存储在 mongo 文档中吗?实际上,由于 mongo 事务跨越单个文档,这不是唯一的选择吗?
下一步是设置一个周期性任务,它将读取所有最近的事件并发布它们以模拟线程外通信。此时,一个好的地方可能是存储事件的单独文档集合。
PS 我暂时不考虑事件溯源,因为它似乎更先进。
谢谢!
解决方案
我想知道我应该在哪里存储事件?
通常的思路是分布式事务很糟糕。因此,如果您可以管理它,您希望将事件与聚合状态一起存储。在 RDBMS 世界中,您的事件位于与聚合数据相同的数据库模式中的表中 - 请参阅Udi Dahan,2014。
如果有帮助,您可以将事件消息的“发件箱”视为聚合中的另一个实体。
保存成功后,您将处理将信息复制到需要的不同位置的问题,并注意失败模式。在这一点上,这纯粹是一个“管道”问题,也就是说,它通常被视为应用程序和基础架构问题,而不是域问题。
推荐阅读
- matlab - 有什么方法可以快速将 C/C++ 函数公开为 MATLAB MEX 文件?
- tensorflow - keras fit_generator:“zip”对象没有属性“shape”
- node.js - 错误:尝试登录后发送标题后无法设置标题
- javascript - 如何在javascript中动态地将复选框添加到表格中
- android - 手动编译apk但是aapt报错
- r - CRON 不执行 R 脚本文件
- laravel - 如何在 Laravel 中编写代码,以便在不刷新页面的情况下执行请求?
- django - 我应该在哪里排序和过滤?后端还是前端?
- android - 当使用 setExactAndAllowWhileIdle 每天发送通知时,它只能工作一天
- reactjs - 如何在 React 中获取点击的元素?