Um dos argumentos comuns para o uso de microsserviços é a melhor escalabilidade. Mas me pergunto se esse argumento é realmente válido.
Digamos que tínhamos um aplicativo composto por 10 microsserviços, sendo que nove deles tinham cada uma duas instâncias (para redundância) e uma delas com quatro instâncias para lidar com a carga (escalabilidade). O argumento pró-microsserviço é que você pode escalar esse miroserviço independentemente dos outros serviços.
No entanto, digamos que todos os 10 microsserviços eram módulos em um único monólito e que várias instâncias (por exemplo, 22 como a soma acima) foram implantadas. O sistema deve ser capaz de lidar com a carga da parte crítica, porque há instâncias suficientes para isso. Se as instâncias não contiverem lógica do programa, a única desvantagem seria que o binário e a quantidade de RAM necessária seriam um pouco maiores. Mas, novamente, a diferença não deve ser muito grande na maioria dos casos - pelo menos não em comparação com o restante da pilha (pense no Spring Boot). A vantagem de um monlito em escala seria um sistema mais simples sem (a maioria das) falácias de um sistema distribuído.
Estou esquecendo de algo?
fonte
Respostas:
O objetivo dos microsserviços não é reduzir a carga do processador. De fato, devido à sobrecarga de comunicação e repetição de funções que costumavam ser códigos de utilidade global, geralmente aumenta um pouco a carga do processador.
O ponto de abolir um monólito é muito mais para ser capaz de manter, implantar e executar um sistema complexo de funcionalidade em tudo . Quando seu sistema atinge um determinado tamanho, compilação, teste, implantação etc., um monólito se torna caro demais para ser possível, mantendo um tempo de atividade decente. Com os microsserviços, você pode atualizar, reiniciar ou reverter um sistema aos poucos.
Não se engane, não escrevemos microsserviços, porque é inerentemente uma solução melhor para agrupar as coisas livremente em interfaces remotas. De fato, a perda do tipo forte e da verificação de consistência que um monólito poderia fornecer geralmente é uma grande desvantagem. Fazemo-lo porque precisamos, porque a complexidade superou-nos e está a tirar o melhor partido de uma situação subótima.
fonte
Você está mais correto. Se você tiver serviços rápidos carregados igualmente, poderá instalá-los em todas as caixas. Não é tão "legal" quanto ter uma caixa por serviço, mas economiza dinheiro.
Contudo. assim que houver um desequilíbrio, digamos que o serviço 5 consiga 100% da CPU por 2 minutos, você deseja mover esse serviço para sua própria caixa para que não bloqueie todos os outros serviços se for executado.
Se as chamadas para o serviço atingirem o tempo limite devido ao carregamento, apenas algumas funções do seu aplicativo falharão em vez de todas.
Agora você pode fazer o mesmo com um monólito bem modularizado. Instale todos os serviços, mas apenas direcione o tráfego do serviço 5 para um deles. Embora não esteja encaminhando o tráfego do serviço 5 para as outras caixas.
Mas, geralmente, os monólitos, por sua própria natureza, não são uma coleção frouxa de serviços que são instalados na mesma caixa. Haverá na memória chamadas entre os módulos, o que causará a falha do aplicativo.
fonte
O objetivo dos microsserviços é 1) separação de preocupações e 2) distribuição de carga. Essencialmente, isso nos libera para fazer o melhor serviço de caixa preta possível com tecnologias específicas para essa tarefa. Nossos serviços podem ser poliglotas - escritos em diferentes linguagens de programação em diferentes pilhas. Equipes diferentes podem trabalhar em cada serviço sem ter conhecimento de como os outros trabalham além do contrato de sua API. Isso, em conjunto, permite uma base de código muito mais simples para cada serviço, mais fácil de depurar, entender e ajustar para desempenho.
fonte