代码之家  ›  专栏  ›  技术社区  ›  Xegara

如何将spring数据弹性搜索与DDD原理相结合?

  •  0
  • Xegara  · 技术社区  · 6 年前

    问题:

    假设域包含3个聚合,并对web应用程序执行给定查询字符串的搜索操作。查询字符串必须用于搜索每个聚合中的所有字段,并将每个聚合的3组返回给用户作为结果查询。web应用程序有两个数据存储区:RDBMS和弹性搜索。我们如何将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。

    这个溶液脏吗?如果是,请提出更好的解决方案。

    1 回复  |  直到 6 年前
        1
  •  1
  •   guillaume31    6 年前

    我认为你在正确的轨道上坚持无知明智。然而,在只能查询ES的情况下,利用RDBMS+ElasticSearch进行简单的搜索操作是一种资源浪费。

    一个 CQRS 这种方法允许您区分需要针对SQL数据库启动事务以编写内容(命令)和只读取ElasticSearch(查询)的情况。