によって書かれた グルカン インディベイ
2023 年 5 月 9 日
複数のテナントにサービスを提供するソフトウェア アプリケーションを構築している場合は、テナント固有のデータの管理と分離という課題にすでに直面しているかもしれません。そこで、django-multitenant ライブラリこのライブラリは 2017 年から積極的に使用されており、現在では月に 10,000 回以上ダウンロードされており、マルチテナントの Django アプリケーションを構築するためのシンプルで柔軟なソリューションを提供します。
このブログ投稿では、マルチテナントの概念をさらに深く掘り下げ、PostgreSQL 上にスケーラブルで安全で保守可能なマルチテナント アプリケーションを構築するのに Django マルチテナントがどのように役立つかを探っていきます。Citus データベース拡張機能。また、実際のシナリオで Django マルチテナントを使用する方法の実践的な例も提供します。したがって、マルチテナント開発プロセスを簡素化したい場合は、読み続けてください。
マルチテナントの概念をすでによく理解している場合は、このマルチテナントの部分をスキップして、以下のセクションに進んでください。
- django-multitenant を使用した Django クエリの自動化
- django-multitenant バージョン 3.2 の新機能
マルチテナンシーとは何ですか?
マルチテナンシーは、ソフトウェア アプリケーションの単一インスタンスが複数の顧客 (テナント) にサービスを提供するアーキテクチャです。各テナントには独自のデータ、構成、ユーザー インターフェイスがありますが、同じコードベースとインフラストラクチャを共有します。すべてのテナントの同時更新により、リソースの効率的な使用、コストの削減、およびメンテナンスの容易化が可能になるため、SaaS アプリケーションにとって有益です。
マルチテナンシーの課題とアプローチ
アプリケーションでマルチテナンシーを扱う場合は、データベースに関するいくつかの問題を考慮して設計する必要があります。
- テナントの分離: データとリソースを確実に分離し、リクエストを正しくルーティングし、テナント固有の構成を管理します。
- スケーラビリティ: スケーラブルなデータベース アーキテクチャを設計し、データを分割し、同時アクセスを管理して増加するテナント負荷に対処します。
- 安全: 追加のセキュリティ対策を実装して、テナント データを保護し、転送中および保存中のデータを保護し、アクセス制御を管理します。
- カスタマイズ: 構成、ブランディング、ワークフローなど、テナントごとにアプリケーションを簡単にカスタマイズできます。
- パフォーマンス: 効率的なデータベース スキーマ設計、キャッシュ、データ アクセス メカニズムを通じてアプリケーションのパフォーマンスを最適化します。
アプリケーションでマルチテナントを管理するには 3 つのアプローチがあります。
- 個別のデータベース- 各テナントには独自のデータベースがあります。
- 共有データベース、個別のスキーマ。テナントは独自のスキーマを持ちますが、同じデータベース内に存在できます。
- 共有データベース、共有スキーマ- すべてのテナントは同じスキーマを共有し、データ オブジェクトにはテナントの所有権を示す tenant_id が含まれている必要があります。
上記の最初の 3 つのアプローチ (個別のデータベースと個別のスキーマ) は、このブログ投稿の範囲外です。
3番目のアプローチ「」に焦点を当てます。共有データベース、共有スキーマ" アプローチ。
共有データベース、共有スキーマによるマルチテナンシー
Django マルチテナントは、テナント間でのスキーマの共有をサポートしています。これにより、メンテナンスの容易化、複雑さの軽減、リソースの使用率の向上、スケーラビリティの向上、データ セキュリティの強化などの利点が得られます。ただし、このアプローチには 2 つの課題があります。それは、Postgres データベースを複数のテナントに拡張することと、アプリケーション開発の複雑さに対処することです。
現在、共有スキーマ アプローチを使用して PostgreSQL 上で Django ORM を使用するマルチテナント アプリケーションを開発している場合は、2 つの問題に対処する必要があります。
- アプリケーションへのテナント ID の追加によるアプリケーションの複雑さ
- テナントを追加しながらアプリケーションをスケーリングする
django-multitenant ライブラリは、上記の最初の問題、つまりアプリケーションの複雑さの解決に役立ちますが、Postgres への Citus 拡張機能分散スケールを有効にするために使用できます。
他にもありますオープンソースとして、およびマネージド サービスの一部として利用可能PostgreSQL 用 Azure Cosmos DB
Citus オープン ソースを使用しているか、Azure Cosmos DB for PostgreSQL マネージド サービスを使用しているかに関係なく、Citus で django-multitenant ライブラリをシームレスに使用できます。 django-multitenant は、アプリケーション開発におけるデータ分離に役立ちます。データ分離には、tenant_id によるクエリのフィルタリング、結合句のテナント列の組み込み、ユーザー入力の保存時に正しいテナント データを記録するなど、注意深い開発プロセスが必要です。これは django-multitenant にとって簡単です。
django-multitenant を使用した Django クエリの自動化
django-multitenant ライブラリは、Django ORM を拡張して、クエリのスコープをテナントごとに自動的かつ均一にします。追加するのは、テナントID
データの取得と操作の両方において。毎月 10,000 回以上ダウンロードされる成熟したライブラリです。
django-multitenant の機能:
- 1 回のメソッド呼び出しでテナントを設定でき、既存のアプリケーション コードは大幅な変更を加えることなく適切なテナントにアクセスします。
- テナント セットを使用すると、ライブラリは結合操作にテナント ID をシームレスに含めるので、テナント ID を手動で追加する必要がなくなります。
- 標準の Django と Django Rest Framework をサポートし、統合を合理化します。
- 分散型 Postgres 拡張機能である Citus のヘルパー クラスを実装し、データベース移行プロセス中のテーブル分散を容易にします。
django-multitenant バージョン 3.2 の新機能
2023 年の初めに、django-multitenant プロジェクトが活発な開発と新しいリリースで再活性化されました。最新リリースのバージョン 3.2 には、次の重要な変更と新機能が含まれています。
- DjangoRestFramework サポートが追加され、マルチテナント データを処理できる RESTful API を簡単に作成できるようになりました。
- モデル移行ガイドラインが改善され、テナント固有のデータをシームレスに移行するのに役立ちます。
- Django の最新バージョン (バージョン 4.1) のサポートにより、最新の機能と改善点を利用できるようになります。
- ManyToMany 関連モデルのテナントを自動的に設定する機能。
- 無効なフィールド名の場合に発生する無効なエラー メッセージを修正しました。
- apps.get_model を使用したモデルの取得のサポート。
- TenantMeta の使用を導入することにより、予約された tenant_id の制限が削除されました。
- ReadTheDocs の導入ドキュメンテーション。
- ManyToMany 非テナント モデルの保存に関する問題を修正しました。
django-multitenant を使い始める方法のクイックスタート
使い方を学びましょうdjango-マルチテナント
バージョン 3.2 で導入された新しく追加された機能を含むサンプル アプリケーション。この例では、架空のプロジェクト管理アプリケーションの Web インターフェイスを提供します。 (この例では、開発効率を高めるために Django Rest Framework を使用していますが、基礎となる Django マルチテナント ライブラリは標準の Django でも動作します。)
始めるには、まず Python パッケージをインストールします。
ピップインストールdjango-multitenantpipインストールジャンゴピップインストールジャンゴレストフレームワーク
モデルに TenantMeta クラスを追加し、テナントを識別するフィールドを指定します。
クラス 国(モデル。モデル): 名前 = モデル。チャーフィールド(最大長=255)クラス アカウント(テナントモデル): ユーザー = モデル。外部キー(ユーザー、 on_delete=モデル。カスケード) 名前 = モデル。チャーフィールド(最大長=255) ドメイン = モデル。チャーフィールド(最大長=255) サブドメイン = モデル。チャーフィールド(最大長=255) 国 = モデル。外部キー(国、 on_delete=モデル。カスケード) クラス テナントメット: テナントフィールド名 = 「ID」クラス マネジャー(テナントモデル): 名前 = モデル。チャーフィールド(最大長=255) アカウント = モデル。外部キー( アカウント、 on_delete=モデル。カスケード、 関連する名前=「マネージャー」 ) クラス テナントメット: テナントフィールド名 = 'アカウントID' クラス メタ: 制約 = [ モデル。固有の制約(田畑=[「ID」、 'アカウントID']、 名前=「unique_manager_account」) ]クラス 計画(テナントモデル): 名前 = モデル。チャーフィールド(最大長=255) アカウント = モデル。外部キー( アカウント、 関連する名前=「プロジェクト」、 on_delete=モデル。カスケード ) マネージャー = モデル。ManyToManyフィールド(マネジャー、 終えた="プロジェクトマネージャ") クラス テナントメット: テナントフィールド名 = 'アカウントID' クラス メタ: 制約 = [ モデル。固有の制約(田畑=[「ID」、 'アカウントID']、 名前=「ユニークなプロジェクトアカウント」) ]クラス プロジェクトマネージャ(テナントモデル): 計画 = テナント外部キー( 計画、 on_delete=モデル。カスケード、 関連する名前=「プロジェクトマネージャー」 ) マネジャー = テナント外部キー(マネジャー、 on_delete=モデル。カスケード) アカウント = モデル。外部キー(アカウント、 on_delete=モデル。カスケード) クラス テナントメット: テナントフィールド名 = 'アカウントID'
テナント列ごとにテーブルを分散します。分散前に制約を削除し、tenant_migrations.Distribute() を介してテーブルを分散し、制約を元に戻す必要があります。
から django_multitenant.db 輸入 移住 として テナント移行確かに get_operations(): オペレーション = [] オペレーション += [ 移住。SQLを実行する( 「ALTER TABLE testing_country DROP CONSTRAINT testing_country_pkey CASCADE;」 )、 移住。SQLを実行する( 「ALTER TABLE testing_manager DROP CONSTRAINT testing_manager_pkey CASCADE;」 )、 移住。SQLを実行する( 「ALTER TABLE testing_project DROP CONSTRAINT testing_project_pkey CASCADE;」 )、 移住。SQLを実行する( 「ALTER TABLE testing_projectmanager DROP CONSTRAINT testing_projectmanager_pkey CASCADE;」 ) ] オペレーション += [ テナント移行。分配("国"、 参照=真実)、 テナント移行。分配("アカウント")、 テナント移行。分配("マネジャー")、 テナント移行。分配("計画")、 テナント移行。分配("プロジェクトマネージャ")、 ] オペレーション += [ 移住。SQLを実行する( 「ALTER TABLE testing_country ADD CONSTRAINT testing_country_pkey PRIMARY KEY (id);」 )、 移住。SQLを実行する( 「ALTER TABLE testing_project ADD CONSTRAINT testing_project_pkey PRIMARY KEY (account_id, id);」 )、 移住。SQLを実行する( 「ALTER TABLE testing_manager ADD CONSTRAINT testing_manager_pkey PRIMARY KEY (account_id, id);」 )、 移住。SQLを実行する( 「ALTER TABLE testing_projectmanager ADD CONSTRAINT testing_projectmanager_pkey PRIMARY KEY (account_id, id);」 )、 ]
モデルと移行に必要な設定はこれですべてです。初期設定が完了したら、コード内のどこかで「set_current_tenant」を呼び出す必要があります。
Django Rest Framework の場合、ライブラリは相互運用して「set_current_tenant」の効果的な呼び出しを保証し、テナント間のデータ漏洩の可能性を防ぎます。
REST アプリケーションを完成させるために、統合手順を完了しましょう。
コード内の適切な場所に「get_tenant」メソッドを定義します。この例では、views ファイルを使用します。
(Video) Citus & Distributed PostgreSQL の成長の 8 つの鍵 | Citus Con 2022基調講演から django_multitenant 輸入 ビュー確かに テナント機能(リクエスト): 戻る アカウント。オブジェクト。フィルター(ユーザー=リクエスト。ユーザー)。初め()ビュー。get_tenant = テナント機能
「TenantModelViewSet」を使用して、マルチテナント モデルのビューセットを構築します。
# views.pyから django_multitenant.views 輸入 テナントモデルビューセットクラス アカウントビューセット(テナントモデルビューセット): """ グループの表示または編集を可能にする API エンドポイント。""" モデルクラス = アカウント シリアライザークラス = アカウントシリアライザー 許可クラス = [権限。認証されています]
設定ファイルのミドルウェア リストに MultitenantMiddleware を追加します。
# 設定.pyミドルウェア= [..「django_multitenant.middlewares.MultitenantMiddleware」、]
それでおしまい。これで、マルチテナント アプリケーションが実行されます。これは、django-multitenant を使用した完全に機能するサンプル アプリケーションへのリンクです。アプリケーションをダウンロードして、そのすべての機能をテストできます。
https://github.com/gurkanindibay/django-mt-examples
使用方法に関する包括的なガイダンスについては、django-マルチテナント、次のリンクからドキュメントを参照できます。https://django-multitenant.readthedocs.io/en/stable/
このライブラリは ORM 内のテナント機能の処理を担当することに注意することが重要です。ただし、アプリケーション コントローラー全体で「set_current_tenant」を呼び出してテナントを設定する必要があります。正しく呼び出せないと、クエリですべてのテナントの結果が取得されてしまい、テナントが insert/ で適切に設定されない可能性があります。更新操作。
マルチテナントと Django-Multitenant の詳細については、こちらをご覧ください。PyCon カナダのプレゼンテーション「Django ORM と Postgres を使用したマルチテナント アプリのスケーリング」については、概要がよくわかります。
django-multitenant はマルチテナント SaaS アプリを簡素化できます
結論として、マルチテナント アプリケーションの構築は、慎重な計画と実装が必要な困難な作業です。 Django-multitenant ライブラリを使用すると、テナント固有のデータを管理および分離するための柔軟でスケーラブルなソリューションを提供することで、マルチテナント開発プロセスを簡素化できます。
最後に、実際のシナリオで Django-multitenant を使用する方法の実践的な例を示し、その使いやすさと柔軟性を示しました。
全体として、積極的な開発とサポートを備えた django-multitenant は、Postgres (および Citus を使用) 上でスケーラブルで安全で保守可能なマルチテナント アプリケーションを構築したい場合に貴重なツールです。
参考文献
マルチテナンシーは非常に幅広い概念です。さらに詳しい情報が必要な場合は、以下のリソースを参照してください。 django-Multitenant について詳しく知りたい場合は、以下のリンクを参照してください。
- django-multitenant のドキュメント
- django-multitenant の GitHub リポジトリ
- Citus データベース (別名分散 PostgreSQL) の GitHub リポジトリ
- その他
- シタス・オン・アズール
- ジャンゴ
- マルチテナント
- オープンソース
- ポストグレ
- パイソン
- SaaS
読んでいるものは楽しいですか?
Citus データベースと Postgres チームからの投稿をさらに読みたい場合は、月刊ニュースレターにサインアップして、最新のコンテンツを直接受信箱に配信してください。

によって書かれたグルカン インディベイ
マイクロソフト社のソフトウェアエンジニア。コンピューターサイエンスの理学士。
- その他
- シタス・オン・アズール
- ジャンゴ
- マルチテナント
- オープンソース
- ポストグレ
- パイソン
- SaaS