繁体   English   中英

春季数据elasticsearch动态多租户索引不匹配?

[英]spring data elasticsearch dynamic multi tenant index mismatch?

我正在通过实现一个集群来试验spring数据elasticsearch,该集群将托管多租户索引,每个租户一个索引。

我能够为每个所需的索引动态创建和设置设置,例如

public class SpringDataES {

    @Autowired
    private ElasticsearchTemplate es;

    @Autowired
    private TenantIndexNamingService tenantIndexNamingService;

    private void createIndex(String indexName) {
        Settings indexSettings = Settings.builder()
                        .put("number_of_shards", 1)
                        .build();
        CreateIndexRequest indexRequest = new CreateIndexRequest(indexName, indexSettings);
        es.getClient().admin().indices().create(indexRequest).actionGet();
        es.refresh(indexName);
    }

    private void preapareIndex(String indexName){
        if (!es.indexExists(indexName)) {
            createIndex(indexName);
        }
        updateMappings(indexName);
    }

这样创建模型

@Document(indexName = "#{tenantIndexNamingService.getIndexName()}", type = "movies")
public class Movie {

  @Id
  @JsonIgnore
  private String id;
  private String movieTitle;
  @CompletionField(maxInputLength = 100)
  private Completion movieTitleSuggest;
  private String director;
  private Date releaseDate;

索引名称是通过SpEl动态传递的

#{tenantIndexNamingService.getIndexName()}

这是由

@Service
public class TenantIndexNamingService {
  private static final String INDEX_PREFIX = "test_index_";

  private String indexName = INDEX_PREFIX;

  public TenantIndexNamingService() {
  }

  public String getIndexName() {
    return  indexName;
  }

  public void setIndexName(int tenantId) {
    this.indexName = INDEX_PREFIX + tenantId;
  }

  public void setIndexName(String indexName) {
    this.indexName = indexName;
  }
}

因此,每当我必须执行CRUD操作时,首先我指向正确的索引,然后执行所需的操作

tenantIndexNamingService.setIndexName(tenantId);
movieService.save(new Movie("Dead Poets Society", getCompletion("Dead Poets Society"), "Peter Weir", new Date()));

我的假设是,以下动态索引分配在多线程Web应用程序中将无法正常工作:

@Document(indexName = "#{tenantIndexNamingService.getIndexName()}"

这是因为TenantIndexNamingService是单例。

所以我的问题是如何以线程保存的方式实现正确的行为?

我可能会采用类似于以下针对Cassandra提出的方法:

您可以在此处查看相关的GitHub存储库:

现在,由于Elastic在定义文档的方式上有所不同,因此您应该主要集中在定义一个请求范围的bean,该bean将封装您的tenant-id并将其绑定到传入的请求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM