如何将spring数据弹性搜索与DDD原则结合?
How to integrate spring data elastic search with DDD principles?
问题:
假设该域包含 3 个聚合,并且针对 Web 应用程序执行给定查询字符串的搜索操作。查询字符串必须用于搜索每个聚合中的所有字段,并将每个聚合的 return 3 组作为结果查询提供给用户。 Web 应用程序有两个数据存储:RDBMS 和 Elastic Search。我们如何将RDBMS+ES基础设施集成到领域层?
建议的解决方案:
我能想到的最好的方法是通过将RDBMS+ES 基础设施实现隐藏在每个域存储库后面来保持域层的持久化无知。这是我提出的伪代码格式的解决方案:
AggregateRepository
- jpaAggregateRepository
- elasticAggregateRepository
@Transactional
+ save(Aggregate) {
Denormalize Aggregate to AggregateDocument (because one aggregate can span many tables)
Persist Aggregate to jpaAggregateRepository
Persist AggregateDocument to elasticAggregateRepository
}
+ find() {
Extract PKs from elasticAggregateRepository.find()
return jpaAggregateRepository(PKs)
}
通过这样做,我成功地阻止了任何基础设施逻辑污染我的域层。为了最终实现用例,我可以在我的应用层执行以下操作:
aggregateOneRepository.find(term)
aggregateTwoRepository.find(term)
aggregateThreeRepository.find(term)
并可能将这 3 组聚合组合成一个 DTO 以供客户端使用。
这个溶液脏了吗?如果是这样,请提出更好的解决方案。
我认为你在正确的轨道上坚持不懈地无知。然而,在只能查询ES的情况下,利用RDBMS + ElasticSearch进行简单的搜索操作是一种资源浪费。
CQRS 方法可以让您区分需要针对 SQL 数据库启动事务以写入内容(命令)和仅读取 ElasticSearch(查询)的情况).
问题:
假设该域包含 3 个聚合,并且针对 Web 应用程序执行给定查询字符串的搜索操作。查询字符串必须用于搜索每个聚合中的所有字段,并将每个聚合的 return 3 组作为结果查询提供给用户。 Web 应用程序有两个数据存储:RDBMS 和 Elastic Search。我们如何将RDBMS+ES基础设施集成到领域层?
建议的解决方案:
我能想到的最好的方法是通过将RDBMS+ES 基础设施实现隐藏在每个域存储库后面来保持域层的持久化无知。这是我提出的伪代码格式的解决方案:
AggregateRepository
- jpaAggregateRepository
- elasticAggregateRepository
@Transactional
+ save(Aggregate) {
Denormalize Aggregate to AggregateDocument (because one aggregate can span many tables)
Persist Aggregate to jpaAggregateRepository
Persist AggregateDocument to elasticAggregateRepository
}
+ find() {
Extract PKs from elasticAggregateRepository.find()
return jpaAggregateRepository(PKs)
}
通过这样做,我成功地阻止了任何基础设施逻辑污染我的域层。为了最终实现用例,我可以在我的应用层执行以下操作:
aggregateOneRepository.find(term)
aggregateTwoRepository.find(term)
aggregateThreeRepository.find(term)
并可能将这 3 组聚合组合成一个 DTO 以供客户端使用。
这个溶液脏了吗?如果是这样,请提出更好的解决方案。
我认为你在正确的轨道上坚持不懈地无知。然而,在只能查询ES的情况下,利用RDBMS + ElasticSearch进行简单的搜索操作是一种资源浪费。
CQRS 方法可以让您区分需要针对 SQL 数据库启动事务以写入内容(命令)和仅读取 ElasticSearch(查询)的情况).