【问题标题】:Collection based multitenancy with Spring Data MongoDBSpring Data MongoDB 基于集合的多租户
【发布时间】:2016-09-24 09:30:39
【问题描述】:

我们的 Spring Boot 1.3.3 应用程序使用 Spring Data MongoDB 1.8.4 在 MongoDB (2.6 或 3.2) 上持久化数据。

我们需要支持多租户。我们选择使用“基于集合”的多租户,即每个租户都有自己的集合集。例如,对于 Article 实体,集合是“{tenantName}_articles”。

Oliver Gierke 在Making spring-data-mongodb multi-tenant 中解释了一个实现,例如:

@Document(collectionName = "#{tenantProvider.getTenantId()}_articles")

这在纸面上非常好,但似乎不适用于现实生活中的应用,因为我发现了两个问题,一个是主要问题:

问题 1(我可以忍受):在应用程序启动时,Spring Boot 使数据库为具有自定义索引(例如 @Indexed 属性)的实体构建索引。但是在启动时,没有“当前租户”,因此 Spring Data 创建了不相关的集合,例如“_articles”。我们如何防止这种情况发生?

问题 2(这里的主要问题):在运行时创建和使用诸如“{tenantName}_articles”之类的多租户集合没有自定义索引(除了“_id”上的默认 MongoDB 索引)。我怀疑 Spring 在运行时会忽略索引,因为它认为它在启动时已经完成了这项工作。这是一个主要的性能问题。我们该如何解决这个问题?

感谢您的宝贵时间。

【问题讨论】:

    标签: mongodb spring-data multi-tenant spring-data-mongodb


    【解决方案1】:

    找到了为给定租户重新创建索引的方法:

    String tenantName = ...;
    
    MongoMappingContext mappingContext = (MongoMappingContext) mongoTemplate.getConverter().getMappingContext();
    MongoPersistentEntityIndexResolver resolver = new MongoPersistentEntityIndexResolver(mappingContext);
    
    for (BasicMongoPersistentEntity entity : mappingContext.getPersistentEntities()) {
        if (entity.findAnnotation(Document.class) == null) {
            // Keep only collection roots
            continue;
        }
    
        String collectionName = entity.getCollection();
        if (!collectionName.startsWith(tenantName)) {
            // Keep only dynamic entities
            continue;
        }
    
        IndexOperations indexOperations = mongoTemplate.indexOps(collectionName);
        for (MongoPersistentEntityIndexResolver.IndexDefinitionHolder holder : resolver.resolveIndexForEntity(entity)) {
            indexOperations.ensureIndex(holder.getIndexDefinition());
        }
    }
    

    我花了一些时间才弄清楚这一点。希望这会有所帮助。欢迎改进。

    【讨论】:

    • 这段代码在哪里写?或给出编写此代码的位置。
    • 如果你的租户可以注册,例如这个代码可以在注册过程中。
    猜你喜欢
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 2014-04-07
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    相关资源
    最近更新 更多