現在、クライアントごとのサーバーアーキテクチャをマルチテナンシーアーキテクチャに移行中です。私たちが抱えている1つの設計上の問題を除いて、すべてが整っています。
サブドメインを使用して、それがどのテナントであるかを判別し、適切なDB(テナントごとのDB)にルーティングします。
次のフィールドを持つテナントクラスがあるとします。
問題は、テナントのデータを保存する方法です。簡単な質問のように聞こえますが、問題は、高速で信頼性が高い必要がある各リクエストで発生するため、各サービスがそのテナントリストにアクセスする必要があることです。ほとんどのサービスは同じマシン上にないことに注意してください。以下のオプションについて検討しましたが、特にあなたの経験に基づいている場合は、あなたの意見を聞いていただければ幸いです。
他の方法がないのですか?
事前にありがとう、シャウル
私が正しく理解している場合は、tenant_id(*)をサービスのほとんど(すべて?)に伝達する必要があります。これにより、そのtenant_idがデータベースアクセス情報に変換されます(すべてのサービスが使用しているのと同じdbであるか、別のもの)。
このケースは認証に非常に似ているようです(私はあなたのサービスがtenant_idの理解を互いに信頼し合うという印象を受けましたが)。
解決策としては、ある種の分散型Key-Valueストレージでも役立つ場合があります。それらは非常に高速なので、おそらく回答をキャッシュする必要すらありません。 Key-Valueデータベースは高可用性クラスタに配置できるため、それらがあなたのアーキテクチャのボトルネックになることもないと思います。
したがって、システムの内部セキュリティがどのように配置されているかに応じて、スケーラブルな認証および承認ソリューションか、キーと値のストレージのいずれかを使用します。
なんらかの理由で、「テナントリストの取得」について言及し続けます。 Key-Valueストレージが特定のtenant_idのテナント情報を検索できる場合、リスト全体がリクエストごとに必要になることすらありません。
「しかし、テナントのテーブル/ DBは他のすべてのサービスに公開されるため、直接クエリを実行できます。」 -これは、すべてのサービスでテナントリストを使用できるようにするというソリューションには満足できないようです。また、リクエストがシステムに入力され、テナントの情報が決定されると、特定のテナントに関する情報の鍵となる、ある種の時間制限付きトークンがさらにリクエストの伝播で使用される可能性があります(暗号化された形式であっても)。このようにすると、サービスがドメインを列挙する機会さえありません(それが問題である場合)。
(*)私はそれをtenant_idと呼んでいますが、それはサブドメインまたはテナントの自然IDである可能性があります。これは、エントリ時に確立できます(テナントを認証していますよね?)