Por que precisamos disso?
O enorme benefício dos microsserviços - e, mais amplamente, da SOA - é o alto nível de abstração dos internos - não apenas a implementação, mas também as tecnologias que estão sendo usadas. Por exemplo, se um sistema é desenvolvido na forma de cinco microsserviços por cinco equipes, uma equipe pode decidir mudar para uma pilha tecnológica completamente diferente (por exemplo, da pilha da Microsoft para a LAMP) sem sequer pedir a opinião de outras equipes.
Veja Amazon AWS ou Twilio. Você sabe se os serviços deles são implementados em Java ou Ruby? Eles usam Oracle ou PostgreSQL ou Cassandra ou MongoDB? Quantas máquinas eles usam? Você se importa com isso? em outras palavras, essas opções tecnológicas afetam a maneira como você usa esses serviços? ... E o mais importante, se eles forem para um banco de dados diferente, você teria que alterar seu aplicativo cliente de acordo?
Agora, o que acontece se dois serviços usam o mesmo banco de dados? Aqui está uma pequena parte dos problemas que podem surgir:
A equipe que desenvolve o serviço 1 deseja passar do SQL Server 2012 para o SQL Server 2016. No entanto, a equipe 2 conta com um recurso descontinuado que foi removido no SQL Server 2016.
O Serviço 1 é um enorme sucesso. Hospedar o banco de dados em duas máquinas (mestre e failover) não é mais uma opção. Mas dimensionar o cluster para várias máquinas requer estratégias como sharding. Enquanto isso, a equipe 2 está feliz com a escala atual e não vê razão para mudar para outra coisa.
O serviço 1 deve passar para UTF-8 como codificação padrão. O Serviço 2, no entanto, está satisfeito com o uso do Code Page 1252 Windows Latin 1.
O serviço 1 decide adicionar um usuário com um nome específico. No entanto, esse usuário já existe, criado há alguns meses pela segunda equipe.
O Serviço 1 precisa de muitos recursos diferentes. O Serviço 2 é um componente altamente crítico e precisa manter os recursos do banco de dados no mínimo para reduzir o risco de ataques.
O serviço 1 requer 15 TB de espaço em disco; a velocidade não é importante; portanto, os discos rígidos comuns estão perfeitamente bem. O Serviço 2 requer no máximo 50 GB, mas precisa acessá-lo o mais rápido possível, o que significa que os dados devem ser armazenados em um SSD.
...
Toda pequena escolha afeta a todos. Toda decisão precisa ser tomada de forma colaborativa, por pessoas de todas as equipes. É necessário fazer acordos. Compare isso com uma total liberdade para fazer o que quiser em um contexto de SOA.
é muito [...] incontrolável.
Então você está fazendo errado. Suponho que você esteja implantando manualmente .
Não é assim que as coisas devem ser feitas. Você precisa automatizar a implantação de máquinas virtuais (ou contêineres do Docker) que executam o banco de dados. Depois de automatizados, a implantação de dois servidores ou vinte servidores ou dois mil servidores não é muito diferente.
A coisa mágica sobre bancos de dados isolados é que é extremamente gerenciável . Você já tentou gerenciar um enorme banco de dados usado por dezenas de equipes? É um pesadelo. Cada equipe tem solicitações específicas e, assim que você toca em algo, isso afeta alguém. Com um banco de dados associado a um aplicativo, o escopo se torna muito restrito, o que significa que há muito menos coisas em que pensar.
Se um banco de dados enorme requer administradores de sistema especializados, os bancos de dados usados por apenas uma equipe podem ser gerenciados por essa equipe (o DevOps também trata disso), liberando o tempo dos administradores de sistema.
é muito caro
Definir custo.
Os custos de licenciamento dependem do banco de dados. Na era da computação em nuvem, tenho certeza de que todos os principais players redesenharam seu licenciamento para acomodar o contexto em que, em vez de um grande banco de dados, existem muitos pequenos. Caso contrário, considere mudar para um banco de dados diferente. A propósito, existem muitos de código aberto.
Se você está falando sobre o poder de processamento, tanto as máquinas virtuais quanto os contêineres são compatíveis com a CPU, e eu não diria que um banco de dados enorme consome menos CPU do que muitos pequenos fazendo o mesmo trabalho.
Se o seu problema for a memória, as máquinas virtuais não são uma boa opção para você. Recipientes são. Você poderá estender quantos quiser, sabendo que eles não consumirão mais RAM do que o necessário. Embora o consumo total de memória seja maior para muitos bancos de dados pequenos em comparação com um único grande, suponho que a diferença não seja muito importante. YMMV.