[英]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.