MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Rendre spring-data-mongodb multi-tenant

Il y a plusieurs façons d'écorcher le chat ici. Tout se résume essentiellement à quel niveau vous souhaitez appliquer la location.

Bases

L'approche de base consiste à lier une sorte de clé identifiant le client sur une base par thread, afin que vous puissiez en savoir plus sur le client avec lequel le thread d'exécution actuel traite. Ceci est généralement réalisé en remplissant un ThreadLocal avec certaines informations liées à l'authentification, car vous pouvez généralement dériver le locataire de l'utilisateur connecté.

Maintenant, si cela est en place, il existe quelques options pour appliquer les connaissances des locataires. Permettez-moi de décrire brièvement les plus courants :

Multilocation au niveau de la base de données

Une façon de séparer les données de plusieurs clients consiste à disposer de bases de données individuelles par locataire. L'abstraction principale de Spring Data MongoDB pour cela est le MongoDBFactory interface. Le moyen le plus simple ici est de remplacer SimpleMongoDbFactory.getDb(String name) et appelez la méthode parent avec le nom de la base de données, par ex. enrichi par le préfixe locataire ou similaire.

Multilocation au niveau de la collecte

Une autre option consiste à avoir des collections spécifiques au locataire, par ex. par le biais de préfixes ou de suffixes de locataire. Ce mécanisme peut en fait être exploité en utilisant le langage Spring Expression (SpEl) dans le @Document collectionName de l'annotation attribut. Tout d'abord, exposez le préfixe du locataire via un bean Spring :

 @Component("tenantProvider")
 public class TenantProvider {

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

Ensuite, utilisez SpEL dans vos types de domaine @Document mappage :

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

SpEl vous permet de faire référence aux beans Spring par leur nom et d'exécuter des méthodes dessus. MongoTemplate (et donc l'abstraction du référentiel de manière transitive) utilisera les métadonnées de mappage de la classe de document et le sous-système de mappage évaluera le collectionName attribut pour connaître la collection avec laquelle interagir.