如何将弹簧数据弹性搜索与DDD原理相集成?

时间:2018-08-01 09:17:29

标签: elasticsearch spring-data domain-driven-design spring-data-elasticsearch

问题:

假定该域包含3个聚合,并且针对Web应用程序执行了给定查询字符串的搜索操作。查询字符串必须用于搜索每个集合中的所有字段,并将每个集合的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)

,并且可能将三组聚合合并到DTO中,以供客户端使用。

此解决方案是否肮脏?如果是这样,请提出更好的解决方案。

1 个答案:

答案 0 :(得分:1)

我认为您对持续性无知是明智的。但是,在只能查询ES的情况下,利用RDBMS + ElasticSearch进行简单的Search操作会浪费资源。

通过CQRS方法,您可以区分需要针对SQL数据库发起事务以编写内容(命令)和仅读取ElasticSearch(查询)的情况。