Multi-inquilino aplicação rails: quais são os prós e contras de diferentes técnicas?

votos
8

Eu originalmente escrevi meu Ruby on Rails aplicativo para um cliente. Agora, eu estou mudando-o para que ele possa ser usado para diferentes clientes. Meu objetivo final é que algum usuário (não eu) pode clicar em um botão e criar um novo projeto. Em seguida, todas as alterações necessárias (Novo esquema, novas tabelas, manipulação de código) são gerados sem que ninguém precisar me para editar um arquivo database.yml ou adicionar novas definições de esquema. Atualmente, estou usando o acesso escopo. Então, eu tenho um modelo de projeto e outros modelos associados têm uma coluna project_id.

Eu olhei para outros posts sobre aplicações multi-tenant em Rails. Muitas pessoas parecem sugerir a criação de um esquema diferente para cada novo cliente no Postgres. Para mim, no entanto, não é muito útil para um novo cliente para ter um esquema diferente em termos de modelo de dados. Cada cliente terá a mesma tabelas, linhas, colunas, etc.

Minha visão para cada cliente é que meu banco de dados de produção de primeira tem uma mesa de diferentes projetos / clientes. E cada uma dessas tabelas links para um conjunto de tabelas que são praticamente o mesmo com dados diferentes. Em outros termos uma tabela de tabelas. Ou em outros termos, o primeiro quadro será mapeado para um conjunto diferente de dados para cada cliente que tem a mesma estrutura.

É a maneira que eu expliquei a minha visão em tudo semelhante à maneira que Postgres implementa diferentes esquemas? Parece-lhe tabelas aninhadas? Ou será que Postgres tem que consultar todas as informações no banco de dados de qualquer maneira? Eu não uso atualmente Postgres, mas eu estaria disposto a aprender se ele se encaixa no projeto. Se você souber de software de banco de dados que trabalha com Rails que se encaixa as minhas necessidades, por favor, me avise.

Agora, eu estou usando escopos para realizar aplicações multi-tenant, mas ele não se sente escalável ou limpo. Isto, contudo, torná-lo muito fácil para um usuário não-técnico para criar um novo projeto desde que eu dar-lhes informações fillable. Você sabe se é possível com o multi-esquema Postgres defintion para tê-lo funcionar automaticamente depois que um usuário clica em um botão? E eu preferiria que esta ser tratado pelo Rails e não por um script externo, se possível? (Por favor, aconselhar de qualquer forma)

Mais importante, você recomenda qualquer plugins ou que eu deveria adoptar um quadro diferente para essa tarefa? Eu descobri Rails a ser limitada em alguns casos de abstração como acima e esta é a primeira vez que eu corri em um problema Rails-scaling.

Qualquer conselhos relacionados a aplicações multi-tenant ou minha situação é bem-vinda. Todas as perguntas de esclarecimento ou de conselhos adicionais são bem-vindas.

Obrigado, --Dave

Publicado 09/08/2011 em 22:08
fonte usuário
Em outras línguas...                            


3 respostas

votos
8

MSDN tem uma boa introdução à arquitetura de dados multi-tenant .

Em uma extremidade do espectro, você tem um banco de dados por inquilino ( "nada compartilhado"). "Nada compartilhado" faz recuperação de desastres bastante simples, e tem o mais alto grau de isolamento entre inquilinos. Mas também tem o maior custo médio por inquilino, e suporta os inquilinos menor número por servidor.

No outro extremo do espectro, você armazena um número inquilino ID em cada linha de cada mesa compartilhado ( "tudo compartilhada"). "Tudo compartilhada" faz recuperação de desastres difícil - para um único inquilino, você tem que restaurar apenas algumas linhas em cada mesa partilhada - e tem o menor grau de isolamento. (Consultas mal formado pode expor dados privados.) Mas tem o menor custo por inquilino, e suporta o maior número de inquilinos por servidor.

Minha visão para cada cliente é que meu banco de dados de produção de primeira tem uma mesa de diferentes projetos / clientes. E cada uma dessas tabelas links para um conjunto de tabelas que são praticamente o mesmo com dados diferentes. Em outros termos uma tabela de tabelas. Ou em outros termos, o primeiro quadro será mapeado para um conjunto diferente de dados para cada cliente que tem a mesma estrutura.

Isso soa como se você estivesse falando de um esquema por inquilino. Preste muita atenção para permissões (SQL GRANT e REVOKE declarações. E ALTER privilégios padrão .)

Respondeu 10/08/2011 em 13:10
fonte usuário

votos
5

Há dois Railscasts sobre multitenancy que o uso de escopos e subdomínios e outra para ajudar com a manipulação de vários esquemas .

Há também a jóia multitenant que poderia ajudar com os seus âmbitos e apartamento gem para lidar com vários esquemas.

Aqui também é uma boa apresentação em multitenancy-com-rails .

Respondeu 24/10/2012 em 00:51
fonte usuário

votos
1

Não se esqueça sobre o uso de escopos padrão, ao criar o nome scops do jeito que é agora trabalha que se sente como isso poderia ser feito melhor. Me deparei com este guia por Samuel Kadolph sobre este assunto há alguns meses e parece que ele poderia trabalhar bem para sua situação e ter o benefício de manter seu aplicativo gratuito de algum PgSQL apenas características.

Basicamente, a forma como ele descreve a configuração da aplicação se envolve adicionando os conceitos de tennants à sua candidatura e, em seguida, usando isso para escopo dos dados no momento da consulta usando o banco de dados.

Respondeu 09/08/2011 em 22:19
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more