Existuje několik způsobů, jak kočku stáhnout z kůže. V podstatě vše závisí na tom, na jaké úrovni byste chtěli nájem uplatnit.
Základy
Základním přístupem je svázat určitý druh klíče identifikujícího zákazníka na bázi jednotlivých vláken, abyste mohli o zákazníkovi zjistit, kterým se aktuální vlákno provádění zabývá. Toho se obvykle dosáhne vyplněním ThreadLocal
s některými informacemi souvisejícími s ověřováním, jak obvykle můžete odvodit tenanta od přihlášeného uživatele.
Nyní, pokud je to na místě, existuje několik možností, kde uplatnit znalosti nájemce. Dovolte mi stručně nastínit ty nejběžnější:
Multi-tenancy na úrovni databáze
Jedním ze způsobů, jak oddělit data pro více klientů, je mít jednotlivé databáze na klienta. Základní abstrakcí Spring Data MongoDB je MongoDBFactory
rozhraní. Nejjednodušší způsob je přepsat SimpleMongoDbFactory.getDb(String name)
a zavolejte rodičovskou metodu s názvem databáze, např. obohacené o předponu nájemce nebo podobně.
Multi-tenancy na úrovni sbírky
Další možností je mít pro nájemce specifické sbírky, např. prostřednictvím pre- nebo postfixů nájemců. Tento mechanismus lze ve skutečnosti využít pomocí jazyka Spring Expression (SpEl) v @Document
collectionName
anotace atribut. Nejprve vystavte předponu tenanta prostřednictvím Spring bean:
@Component("tenantProvider")
public class TenantProvider {
public String getTenantId() {
// … implement ThreadLocal lookup here
}
}
Poté použijte SpEL ve vaší doméně typu @Document
mapování:
@Document(collectionName = "#{tenantProvider.getTenantId()}_accounts"
public class Account { … }
SpEl vám umožňuje odkazovat na jarní fazole jménem a provádět na nich metody. MongoTemplate
(a tedy abstrakce úložiště tranzitivně) použije mapovací metadata třídy dokumentu a mapovací subsystém vyhodnotí collectionName
atribut, abyste se dozvěděli o sbírce, se kterou chcete komunikovat.