sql >> Base de Datos >  >> NoSQL >> MongoDB

Haciendo spring-data-mongodb multi-inquilino

Hay bastantes formas de despellejar al gato aquí. Esencialmente, todo se reduce a en qué nivel le gustaría aplicar la tenencia.

Conceptos básicos

El enfoque básico es vincular algún tipo de clave que identifique al cliente por hilo, de modo que pueda averiguar sobre el cliente con el que trata el hilo de ejecución actual. Esto generalmente se logra completando un ThreadLocal con cierta información relacionada con la autenticación, ya que normalmente puede derivar el arrendatario del usuario que inició sesión.

Ahora, si eso está en su lugar, hay algunas opciones de dónde aplicar el conocimiento del arrendatario. Permítanme resumir brevemente los más comunes:

Multiusuario a nivel de base de datos

Una forma de separar los datos de varios clientes es tener bases de datos individuales por arrendatario. La abstracción central de Spring Data MongoDB para esto es MongoDBFactory interfaz. La forma más fácil aquí es anular SimpleMongoDbFactory.getDb(String name) y llame al método principal con el nombre de la base de datos, p. enriquecido por el prefijo de arrendatario o similar.

Multiusuario en el nivel de colección

Otra opción es tener colecciones específicas de inquilinos, p. a través de prefijos o sufijos de arrendatario. Este mecanismo en realidad se puede aprovechar usando el lenguaje Spring Expression (SpEl) en el @Document collectionName de la anotación atributo. Primero, exponga el prefijo del arrendatario a través de un bean Spring:

 @Component("tenantProvider")
 public class TenantProvider {

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

Luego use SpEL en sus tipos de dominio @Document asignación:

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

SpEl le permite referirse a Spring beans por su nombre y ejecutar métodos en ellos. MongoTemplate (y, por lo tanto, la abstracción del repositorio de forma transitiva) utilizará los metadatos de mapeo de la clase de documento y el subsistema de mapeo evaluará el collectionName atributo para conocer la colección con la que interactuar.