Estou tentando criar uma solução SaaS baseada na Web e segui um caminho em que não tenho certeza de usar a multilocação ou a instância múltipla. Vou tentar descrever o que estou tentando alcançar, e cada abordagem tem vantagens e desvantagens (minha opinião, de acordo com o que li). Inclua suas sugestões no caso de eu ter perdido alguma coisa em uma abordagem em relação à outra.
O aplicativo que estou tentando criar é, como mencionei, uma solução SaaS onde as empresas podem criar suas contas, e cada conta / empresa possui seus próprios usuários, clientes, produtos, serviços ... etc. Cada usuário; quem é funcionário da empresa; relacionados a uma conta / empresa terão acesso apenas aos clientes, produtos e serviços de sua empresa. As empresas podem ter um número ilimitado de clientes, produtos e serviços, portanto, cada empresa deve ter seu próprio data center.
Para isso, decidi criar um banco de dados compartilhado (salvando todas as credenciais de usuários para fins de login) e um esquema compartilhado de vários bancos de dados (banco de dados por conta / empresa). Basicamente, multilocação .
Em seguida, alguém sugeriu o uso de várias instâncias , em que cada empresa terá sua própria instância do aplicativo (ou seja, código, bibliotecas, banco de dados, estruturas ... etc) totalmente separada das outras empresas. Isso soa melhor, pois não preciso cuidar de uma camada extra, na qual preciso garantir que os usuários de cada inquilino tenham acesso apenas aos dados da empresa. Eu acho bom mencionar que estou dependendo do Docker para alcançar essa abordagem (nunca a usei antes), mas acho que carece de recursos (mais detalhes sobre isso mais tarde) que precisarei no futuro (pelo menos não encontre-os com um pouco de pesquisa).
No entanto, cada abordagem vem com prós e contras, então não pude tomar uma decisão sobre qual abordagem seguir. Aqui está uma lista, mas exposta comigo, já que não tenho o conhecimento dos dois, para que possa haver algo que eu não conheça, ou uma solução para um problema que não encontrei na web: [Cada abordagem tem uma lista ordenada da qual eu segui uma comparação uma a uma]
Multi-locação :
- Host / hardware compartilhado, código compartilhado e vários bancos de dados.
- É mais fácil estender a funcionalidade do código e corrigir bugs (código compartilhado).
- É mais difícil estender o hardware (poderia usar um serviço de nuvem) ou mover o banco de dados de inquilino individual para outro sistema sem fazer alterações no código.
- Mais importante, como mencionei antes, preciso adicionar uma camada extra ao sistema para garantir que o usuário realmente pertença à sua empresa e não acesse as informações de outras empresas.
Multi-instância :
- Host / hardware compartilhado ou não compartilhado, código por instância e banco de dados por instância.
- É mais difícil estender a funcionalidade ou corrigir erros (não tenho certeza se existe uma maneira de fazê-lo no Docker, onde você pode adicionar funcionalidade / recurso a uma instância ou contêiner do Docker e implantá-lo nas outras).
- É mais fácil mover a instância inteira para um host / hardware diferente.
- Como instância, não preciso cuidar dessa camada, pois cada instância terá seu próprio banco de dados.
Todas as vantagens e desvantagens são redundantes, caso eu queira fazer algo manualmente (como criar uma instância para cada inquilino manualmente), e é por isso que duvido da solução Docker, a menos que haja uma maneira de resolver isso, que talvez seja a principal razão da pergunta. Eu apreciaria se você respondesse à pergunta com referências às soluções e por que você acha que essa abordagem é melhor que a outra.
Caso isso ajude (talvez?), Estamos usando o Laravel como a principal estrutura para o back-end (tudo RESTfully).