ここで猫の皮を剥ぐ方法はたくさんあります。基本的にすべて、テナンシーを適用するレベルに要約されます。
基本
基本的なアプローチは、スレッドごとに顧客を識別するある種のキーをバインドすることです。これにより、現在の実行スレッドが扱っている顧客について知ることができます。これは通常、ThreadLocal
にデータを入力することで実現されます。 通常、ログインしているユーザーからテナントを取得できるため、認証関連の情報が含まれています。
これで、テナントの知識をどこに適用するかについていくつかのオプションがあります。最も一般的なものの概要を簡単に説明します:
データベースレベルでのマルチテナンシー
複数のクライアントのデータを分離する1つの方法は、テナントごとに個別のデータベースを用意することです。これに対するSpringDataMongoDBのコア抽象化は、MongoDBFactory
です。 インターフェース。ここでの最も簡単な方法は、SimpleMongoDbFactory.getDb(String name)
をオーバーライドすることです。 データベース名を使用して親メソッドを呼び出します。例:テナントプレフィックスなどで強化されています。
コレクションレベルでのマルチテナンシー
別のオプションは、テナント固有のコレクションを持つことです。テナントの前置または後置を介して。このメカニズムは、@Document
でSpringExpression言語(SpEl)を使用することで実際に活用できます。 アノテーションのcollectionName
属性。まず、SpringBeanを介してテナントプレフィックスを公開します。
@Component("tenantProvider")
public class TenantProvider {
public String getTenantId() {
// … implement ThreadLocal lookup here
}
}
次に、ドメインタイプ@Document
でSpELを使用します マッピング:
@Document(collectionName = "#{tenantProvider.getTenantId()}_accounts"
public class Account { … }
SpElを使用すると、Spring Beanを名前で参照し、それらに対してメソッドを実行できます。 MongoTemplate
(したがって、リポジトリの抽象化は一時的に)ドキュメントクラスのマッピングメタデータを使用し、マッピングサブシステムはcollectionName
を評価します 対話するコレクションについて調べるための属性。