私は、Djangoに基づいてマルチテナンシーアプリケーションを作成するための正しい/最適な方法を模索してきました。
いくつかの説明:
アプリケーションは、複数のテナント(tenant1、tenant2、...、)で使用できます。
すべてのテナント個人データは、他のテナント(およびそのユーザー)のアクセスから保護する必要があります。
オプションで、テナントはアプリケーションオブジェクト用に追加のカスタムフィールドを作成できます。
もちろん、基盤となるハードウェアは、1つの「システム」上のテナントの数を制限します。
1)各テナントを例:サブドメインおよび基盤となるレイヤーでのテナント固有のデータベースの使用
2)モデル内のテナントIDを使用して、データベース内のテナントデータを分離します
展開プロセス、システムパーツ(Webサーバー、データベースサーバー、作業ノードなど)のパフォーマンスについて考えています。
最適な設定は何ですか?長所と短所はどこにありますか?
どう思いますか?
次のアーキテクチャを使用して、マルチテナンシーを構築しました platform 。役立つヒントが見つかるといいのですが。
(r'^(?P<tenant_id>[\w\-]+)
_のようなプレフィックスが付いています。threading.local
_を使用するのと同様)login_required
_など)、ミドルウェア、またはファクトリを作成して、ビューを保護し、適切なモデルを選択します環境に関しては、次の設定を使用します。
私の観点からすると、このセットアップには次の長所と短所があります。
プロ:
対照:
もちろん、最適なアーキテクチャは、テナントの数、モデルのデルタ、セキュリティ要件などの要件に大きく依存します。
更新:アーキテクチャを確認したので、ポイント2に示すようにURLを書き換えないことをお勧めします-3。より良い解決策は、_tenant_id
_をリクエストヘッダーとして配置し、request.META.get('TENANT_ID', None)
のようなものでリクエストから_tenant_id
_を抽出(ポイント4)することだと思います。このようにしてニュートラルなURLを取得し、Django組み込み関数(例:_{% url ...%}
_またはreverse()
)または外部アプリを使用する方がはるかに簡単です。
関連する議論へのいくつかのポインタは次のとおりです。
mezzanine.utils.sites.current_site_id
、mezzanine.core.models.SiteRelated
およびmezzanine.core.request
https://github.com/bcarneiro/Django-tenant-schemas をご覧になることをお勧めします。 postgresqlスキーマを使用することを除いて、Retoが述べたように問題を少し解決します。