2011-05-06 4 views
13

나는 Heroku에서 배치하기 위해 Rails 3 앱을 구축 중이며, 모델에서 다중 소유를 처리하는 방법에 대한 권장 사항이 있는지 궁금합니다. 반년 전에, 여기에 관련 질문 (#3776593)이 게시되었지만 많은 답변을 얻지 못했습니다. 나는 또한 Guy Naor's presentation on writing multi-tenant applications with Rails을 보았지만 3 가지 제안 된 솔루션 중 2 가지가 Heroku에서 작동하지 않는 것으로 보입니다. 나는 이것들에 링크 할 것이지만, 새로운 Stackoverflow 사용자는 2 개의 하이퍼 링크로 제한되어있다.Heroku에서 배포 할 멀티 테넌트 Rails 3 앱 작성

은 또한 다음과 같은 도구 건너했습니다

는 멀티 테넌트 보석 또는 간단한 레일 - 멀티 중 경험이 있다면 그냥 궁금 임차 보석. 가장 직접적인 해결책은 계정 아래에 있어야하는 모든 모델에 belongs_to를 넣는 것일뿐입니다.하지만 실제 세상에서 사용하는 제품을 알고 싶습니다.

+1

호기심에서 어떻게 해결 되었습니까? – kmurph79

답변

6

접근 방식은 일반적으로 세입자 당 하나의 데이터베이스를 의미하는 "공유 없음"에서 "모든 것을 공유"(일반적으로 각 테이블에 많은 세입자의 행이 있음을 의미)의 범위입니다. 스펙트럼 (아래)은 격리 수준, 비용 (입주자 당 비용), 재해 복구 용이성별로 분류 할 수 있습니다.

  • 입주자 당 하나의 데이터베이스; 가장 높은 비용, 최고의 격리, 가장 쉬운 복구.
  • 세입자 당 하나의 스키마. 다른 두 개 사이의 비용, 양호한 격리, 비교적 쉬운 복구이지만 복구는 일반적으로 다른 입주자의 성능을 저하시킵니다.
  • 세입자 간의 테이블 공유; 최저 비용, 최저 격리 (공유 테이블), 어려운 재해 복구 (복구는 대개 모든 테이블에 대해 일부 행을 복구 함을 의미합니다). 복구는 일반적으로 다른 임차인의 경우 성능을 "많이"저하시킵니다.

이들은 모두 특정 플랫폼에 따라 다릅니다. dbms가 쿼리가 둘 이상의 데이터베이스에 액세스하지 못하게하는 경우 "테넌트 당 하나의 데이터베이스"가 가장 높은 격리 수준을 갖습니다. 그러나 일부 플랫폼에서는 여러 데이터베이스에서 쿼리 할 수 ​​있습니다.

MSDN에는 높은 점수를주는 괜찮은 기사가 있습니다 : Multi-Tenant Data Architecture.

그러나 Heroku에 한정되어 있다면 Heroku가 지원하는 옵션을 선택해야합니다. 이러한 옵션이 무엇인지는 모르지만 개발시 SQLite를 사용하지 않는 것이 좋습니다. Heroku 배포는 PostgreSQL에서 실행됩니다. PostgreSQL에 대한 개발이 필요합니다.

6

멀티 테넌트 (maitantant) 보석의 저자는 분명히 편향되어 있지만, 정말 훌륭한 솔루션이라고 생각합니다! 이 젬의 목표는 공통적 인 애플리케이션 요구를 단순화하고 구현하기가 쉽도록 만드는 것입니다.

"오래된 학교"대안은 모든 쿼리가 연결된 부모를 통해 수행되도록 레일스 객체 체인을 사용하는 것입니다. 이 접근법의 문제점은 Tenant 객체가 has_many 연관을위한 투기장이된다는 것입니다.

class Tenant 
    has_many :users 
end 
# query for users in the current tenant 
current_tenant.users.find params[:id] 

multitenant gem은 생성 된 모든 쿼리가 현재 세입자를 자동으로 인식하도록하여이를 해결합니다.그리고은 새로운 레코드가 생성되어 현재의 임차인에게 자동 할당되므로 특별한 before_save 콜백을 추가 할 필요가 없습니다.

예 :

Multitenant.with_tenant current_tenant do 
    # queries within this block are automatically 
    # scoped to the current tenant 
    User.all 

    # records created within this block are 
    # automatically assigned to the current tenant 
    User.create :name => 'Bob' 
end 
+3

안녕하세요, 왜 Multitentant.with_tenant 방식을 사용하지 않고 default_scope를 활용하지 않았습니까? – rafamvc

2

내가 (작은 레일 애플 리케이션을위한 멀티 테넌시 (multi-tenancy)를 구현)이 벤처에 착수하려고 생각하고 연구를하고있는 동안 나는이 SO 게시물에 비틀 거렸다.

Heoku가 지원하는 PostgreSQL 스키마를 사용하여 MT를 구현 한 RyanB의 훌륭한 스크린 캐스트에 대해 언급 한 사람은 아무도 없습니다.

여기는 스크린 캐스트 http://railscasts.com/episodes/389-multitenancy-with-postgresql에 대한 링크입니다.

개념 :

은 레일 응용 프로그램에서, 우리는 페이지 연결

 connection.schema_search_path = "schema1, schema2, ..." 

거기 해당 테이블을 발견하면 후속 조치가 SCHEMA1에 실행됩니다에 대한 검색 경로를 설정할 수 있습니다. 그렇지 않으면 schema2의 테이블을 검색합니다. 세입자를 포함한 전체 앱 스키마를 사용하는 것이 공개적이며 평소의 관행은 공용 스키마에서 테넌트를 제외한 모든 테이블을 비우는 것입니다.

새로운 세입자 등록 :

는 새로운 세입자를위한 새로운 스키마를 생성하고이 새로운 스키마로 (거주자 제외) 모든 (부하 schema.rb) 응용 프로그램 테이블을 만들려면 임차인 모델에 after_create 기능을 추가합니다.

사용자 : 사용자가 방문, subdomain1.myapp.com은, 세입자 테이블에서이 하위 도메인에 대한 스키마를 찾아서 ', SCHEMA1 공개'로 연결 검색 경로를 설정하고 사용자를 인증

.

제 의도는 솔루션의 개념을 설명하기위한 것입니다. 실제 솔루션은 RyanB의 스크린 캐스트를 참조하십시오.

관련 문제