Django의 다중 테넌트 애플리케이션을위한 최적의 아키텍처
Django를 기반으로 멀티 테넌시 애플리케이션을 만드는 올바른 / 최적의 방법을 고민해 왔습니다.
몇 가지 설명 :
응용 프로그램은 여러 테넌트 (tenant1, tenant2, ...,)에서 사용할 수 있습니다.
모든 테넌트-개별 데이터는 다른 테넌트 (및 해당 사용자)의 액세스로부터 보호되어야합니다.
선택적으로 테넌트는 애플리케이션 개체에 대한 추가 사용자 정의 필드를 만들 수 있습니다.
물론 기본 하드웨어는 하나의 "시스템"에서 테넌트 수를 제한합니다.
1) 하위 도메인별로 각 테넌트를 분리하고 기본 계층에서 테넌트 별 데이터베이스 사용
2) 모델에서 일부 tenant-ID를 사용하여 데이터베이스에서 tenant-data를 분리
배포 프로세스, 시스템 부품 (웹 서버, 데이터베이스 서버, 작업 노드, ...)의 성능에 대해 생각하고 있습니다.
가장 좋은 설정은 무엇입니까? 장단점은 어디에 있습니까?
어떻게 생각해?
다음 아키텍처를 사용하여 멀티 테넌시 플랫폼 을 구축했습니다 . 유용한 힌트를 찾을 수 있기를 바랍니다.
- 각 테넌트는 하위 도메인 (t1.example.com)을 얻습니다.
- URL 재 작성을 사용하면 Django 애플리케이션에 대한 요청이 example.com/t1과 같은 것으로 재 작성됩니다.
- 모든 URL 정의에는 다음과 같은 접두사가 붙습니다.
(r'^(?P<tenant_id>[\w\-]+)
- 미들웨어 프로세스와 tenant_id 소모 및 요청 (예 request.tenant = 'T1')에 추가
- 이제 모든보기에서 tenant_id 인수를 지정하지 않고도 각보기에서 현재 테넌트를 사용할 수 있습니다.
- 어떤 경우에는 요청을 사용할 수 없습니다. I는 현재 스레드에 tenant_id 결합하여이 문제를 해결합니다 (유사한 현재 언어 사용
threading.local
) - 데코레이터 (예 : 테넌트 인식
login_required
), 미들웨어 또는 팩토리를 만들어 뷰를 보호하고 올바른 모델을 선택합니다. - 데이터베이스와 관련하여 두 가지 시나리오를 사용했습니다.
- 여러 데이터베이스를 설정하고 현재 테넌트에 따라 라우팅을 구성합니다 . 나는 이것을 처음 사용했지만 약 1 년 후에 하나의 데이터베이스로 전환했습니다. 그 이유는 다음과 같습니다.
- 데이터를 분리하기 위해 높은 보안 솔루션이 필요하지 않았습니다.
- 다른 세입자는 거의 모든 동일한 모델을 사용했습니다.
- 우리는 많은 데이터베이스를 관리해야했습니다 (쉽게 업데이트 / 마이그레이션 프로세스를 구축하지 않았습니다).
- 사용자 및 다른 모델에 대한 간단한 매핑 테이블과 함께 하나의 데이터베이스를 사용하십시오. 추가 및 테넌트 특정 모델 필드를 추가하기 위해 모델 상속 을 사용 합니다 .
- 여러 데이터베이스를 설정하고 현재 테넌트에 따라 라우팅을 구성합니다 . 나는 이것을 처음 사용했지만 약 1 년 후에 하나의 데이터베이스로 전환했습니다. 그 이유는 다음과 같습니다.
환경과 관련하여 다음 설정을 사용합니다.
내 관점에서이 설정에는 다음과 같은 장단점이 있습니다.
찬성:
- 현재 테넌트를 알고있는 하나의 애플리케이션 인스턴스
- 프로젝트의 대부분의 부분은 테넌트 특정 문제로 귀찮게 할 필요가 없습니다.
- 모든 테넌트간에 엔터티를 공유하기위한 간편한 솔루션 (예 : 메시지)
대조 :
- 하나의 매우 큰 데이터베이스
- 모델 상속으로 인해 매우 유사한 테이블
- 데이터베이스 계층에서 보안되지 않음
물론 최상의 아키텍처는 테넌트 수, 모델 델타, 보안 요구 사항 등의 요구 사항에 따라 크게 달라집니다.
업데이트 : 아키텍처를 검토 한 결과 2-3 번 항목에 표시된대로 URL을 다시 작성 하지 않는 것이 좋습니다 . 더 나은 해결책은을 tenant_id
요청 헤더로 넣고 .NET과 같은 요청에서 추출 (포인트 4)하는 tenant_id
것입니다 request.META.get('TENANT_ID', None)
. 이렇게하면 중립 URL을 얻을 수 있으며 Django 내장 함수 (예 : {% url ...%}
또는 reverse()
) 또는 외부 앱 을 사용하는 것이 훨씬 더 쉽습니다 .
다음은 관련 토론에 대한 몇 가지 지침입니다.
- Django 티켓 # 15089 : "contrib.sites 및 멀티 테넌시"
- Google 그룹스 에 대한 토론 은 esp를 참조하십시오. 끝에 Jari Pennanen의 솔루션
- Mezzanine에서 threadlocals 기반 멀티 테넌시 를 도입 한 패치 ; esp를 참조하십시오.
mezzanine.utils.sites.current_site_id
,mezzanine.core.models.SiteRelated
및mezzanine.core.request
- the django-simple-multitenant re-usable app on PyPI
I recommend taking a look at https://github.com/bcarneiro/django-tenant-schemas. It will solve your problems a bit like Reto mentioned, except that it uses postgresql schemas.
'program tip' 카테고리의 다른 글
C ++는 동적 배열의 크기를 알려주지 않습니다. (0) | 2020.12.02 |
---|---|
특정 Jenkins 작업이 동시에 실행되는 것을 방지하는 방법은 무엇입니까? (0) | 2020.12.02 |
HTTP_CLIENT_IP와 HTTP_X_FORWARDED_FOR의 차이점은 무엇입니까? (0) | 2020.12.02 |
string.Format이 null 값을 처리하는 방법은 무엇입니까? (0) | 2020.12.02 |
CSS를 사용하여 고정 헤더로 스크롤 가능한 테이블을 만드는 방법 (0) | 2020.12.02 |