TL;DR

1 つのソフトウェアのインスタンスで、複数のテナントにサービスを提供する方式。テナントとは、そのインスタンスに共通の権限でアクセスする利用者のグループのことである。

なぜ必要か

Wikipedia によると、1 つのインスタンスを共有すれば、メモリや処理のオーバーヘッドを多くの顧客で分け合えるので、コストを下げられる。更新も顧客ごとではなく 1 か所で行えばよいので、リリースの管理が簡単になる。

仕組み

各テナントには、インスタンスの中の専用の領域が割り当てられ、データや設定が分けられる。Wikipedia は、データの分け方として次の 3 つを挙げている。

  • テナントごとにデータベースを分ける: 分離は最も強いが、テナントあたりのコストが最も高い
  • データベースは共有し、スキーマを分ける: 分離と密度のバランスを取る
  • データベースもスキーマも共有し、テナント ID の列で区別する: 最も安く密度も高いが、分離はアプリケーションの実装に頼ることになり、安全にするのが最も難しい

例

Zitadel では、Instance の中の Organization がテナントに当たり、User や Project を管理する。Row-Level Security は、マルチテナントのアプリケーションが代表的なユースケースである。

注意点

Wikipedia によると、複数の顧客のデータが混在するので、セキュリティのテストはより厳しくなる。1 つのインスタンスへの更新に問題があると、全テナントが同時に止まるおそれもある。また、1 つのテナントが過大な負荷をかけると他のテナントの性能が落ちる(ノイジーネイバー)ので、テナントごとのレートリミットやクォータが必要になることが多い。

関連

出典