MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Rendere spring-data-mongodb multi-tenant

Ci sono molti modi per scuoiare il gatto qui. In sostanza, tutto si riduce a quale livello desideri applicare l'affitto.

Nozioni di base

L'approccio di base consiste nell'associare una sorta di chiave che identifica il cliente in base al thread, in modo da poter scoprire il cliente con cui si occupa il thread di esecuzione corrente. Questo di solito si ottiene compilando un ThreadLocal con alcune informazioni relative all'autenticazione poiché di solito puoi derivare il tenant dall'utente che ha effettuato l'accesso.

Ora, se è a posto, ci sono alcune opzioni su dove applicare la conoscenza dell'inquilino. Consentitemi di delineare brevemente quelli più comuni:

Multi-tenancy a livello di database

Un modo per separare i dati per più client consiste nell'avere database individuali per tenant. L'astrazione principale di Spring Data MongoDB per questo è MongoDBFactory interfaccia. Il modo più semplice qui è sovrascrivere SimpleMongoDbFactory.getDb(String name) e chiama il metodo genitore con il nome del database, ad es. arricchito dal prefisso tenant o simili.

Multi-locazione a livello di raccolta

Un'altra opzione è quella di avere raccolte specifiche del tenant, ad es. tramite prefisso o suffisso inquilino. Questo meccanismo può essere effettivamente sfruttato utilizzando il linguaggio Spring Expression (SpEl) nel @Document collectionName dell'annotazione attributo. Innanzitutto, esponi il prefisso tenant tramite un bean Spring:

 @Component("tenantProvider")
 public class TenantProvider {

   public String getTenantId() {
     // … implement ThreadLocal lookup here
   }
 }

Quindi usa SpEL nei tipi di dominio @Document mappatura:

 @Document(collectionName = "#{tenantProvider.getTenantId()}_accounts"
 public class Account { … }

SpEl ti consente di fare riferimento ai bean Spring per nome ed eseguire metodi su di essi. MongoTemplate (e quindi l'astrazione del repository in modo transitivo) utilizzerà i metadati di mappatura della classe del documento e il sottosistema di mappatura valuterà il collectionName attributo per conoscere la collezione con cui interagire.