sql >> Database >  >> NoSQL >> MongoDB

Spring-data-mongodb multi-tenant maken

Er zijn nogal wat manieren om de kat hier te villen. Het komt er in wezen allemaal op neer op welk niveau u de huurovereenkomst wilt toepassen.

Basis

De basisbenadering is om een ​​soort sleutel te binden die de klant per thread identificeert, zodat u meer te weten kunt komen over de klant waarmee de huidige uitvoeringsdraad te maken heeft. Dit wordt meestal bereikt door het invullen van een ThreadLocal met enige authenticatie-gerelateerde informatie, aangezien u de huurder gewoonlijk kunt afleiden van de ingelogde gebruiker.

Als dat op zijn plaats is, zijn er een paar opties voor het toepassen van de kennis van de huurder. Laat me de meest voorkomende kort schetsen:

Multi-tenancy op databaseniveau

Een manier om gegevens voor meerdere clients te scheiden, is door afzonderlijke databases per Tenant te hebben. Spring Data MongoDB's kernabstractie hiervoor is de MongoDBFactory koppel. De gemakkelijkste manier is om SimpleMongoDbFactory.getDb(String name) te overschrijven en roep de bovenliggende methode aan met de databasenaam, b.v. verrijkt met het voorvoegsel van de huurder of iets dergelijks.

Multi-tenancy op collectieniveau

Een andere optie is om huurderspecifieke incasso's te hebben, b.v. door huurder pre- of postfixes. Dit mechanisme kan daadwerkelijk worden benut door de Spring Expression-taal (SpEl) te gebruiken in het @Document annotatie's collectionName attribuut. Stel eerst het voorvoegsel van de huurder bloot via een lenteboon:

 @Component("tenantProvider")
 public class TenantProvider {

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

Gebruik dan SpEL in uw domeintypes @Document in kaart brengen:

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

Met SpEl kunt u bij naam verwijzen naar lentebonen en er methoden op uitvoeren. MongoTemplate (en dus de repository-abstractie transitief) zal de mapping-metadata van de documentklasse gebruiken en het mapping-subsysteem zal de collectionName evalueren attribuut om meer te weten te komen over de collectie om mee te werken.



  1. MongoDB databaseschema-ontwerp

  2. is er een mangoest verbindingsfout callback

  3. MongoDB $toDate

  4. Wat is de gemakkelijkste manier om de grootste objecten in Redis te vinden?