Vamos falar de pontos positivos e negativos da abordagem de microsserviço.
Primeiros negativos. Ao criar microsserviços, você adiciona complexidade inerente ao seu código. Você está adicionando sobrecarga. Você está dificultando a replicação do ambiente (por exemplo, para desenvolvedores). Você está dificultando a depuração de problemas intermitentes.
Deixe-me ilustrar uma desvantagem real. Considere hipoteticamente o caso em que você tem 100 microsserviços chamados ao gerar uma página, cada um dos quais faz a coisa certa 99,9% do tempo. Mas 0,05% do tempo eles produzem resultados errados. E em 0,05% do tempo há uma solicitação de conexão lenta, onde, digamos, é necessário um tempo limite de TCP / IP para conectar-se e isso leva 5 segundos. Cerca de 90,5% das vezes o seu pedido funciona perfeitamente. Mas cerca de 5% das vezes você tem resultados errados e cerca de 5% das vezes sua página é lenta. E toda falha não reproduzível tem uma causa diferente.
A menos que você pense muito em ferramentas para monitorar, reproduzir etc., isso vai se tornar uma bagunça. Particularmente quando um microsserviço chama outro que chama outro com algumas camadas de profundidade. E uma vez que você tenha problemas, isso só piorará com o tempo.
OK, isso parece um pesadelo (e mais de uma empresa criou enormes problemas para si, seguindo esse caminho). O sucesso só é possível: você está claramente ciente da possível desvantagem e trabalha constantemente para resolvê-la.
Então, e a abordagem monolítica?
Acontece que um aplicativo monolítico é tão fácil de modularizar quanto os microsserviços. E uma chamada de função é mais barata e mais confiável na prática do que uma chamada RPC. Portanto, você pode desenvolver a mesma coisa, exceto que é mais confiável, corre mais rápido e envolve menos código.
OK, então por que as empresas adotam a abordagem de microsserviços?
A resposta é que, à medida que você escala, há um limite para o que você pode fazer com um aplicativo monolítico. Depois de tantos usuários, tantas solicitações e assim por diante, você chega a um ponto em que os bancos de dados não são dimensionados, os servidores da Web não conseguem manter seu código na memória e assim por diante. Além disso, as abordagens de microsserviço permitem atualizações independentes e incrementais do seu aplicativo. Portanto, uma arquitetura de microsserviço é uma solução para dimensionar seu aplicativo.
Minha regra pessoal é que ir do código em uma linguagem de script (por exemplo, Python) ao C ++ otimizado geralmente pode melhorar 1-2 ordens de magnitude no desempenho e no uso da memória. Indo para o outro lado de uma arquitetura distribuída adiciona uma magnitude aos requisitos de recursos, mas permite escalar indefinidamente. Você pode fazer uma arquitetura distribuída funcionar, mas é mais difícil.
Portanto, eu diria que se você está iniciando um projeto pessoal, fique monolítico. Aprenda a fazer isso bem. Não seja distribuído porque (Google | eBay | Amazon | etc) são. Se você desembarcar em uma grande empresa que é distribuída, preste muita atenção em como eles fazem o trabalho e não estrague tudo. E se você acabar tendo que fazer a transição, tenha muito, muito cuidado, porque você está fazendo algo difícil que é fácil de ficar muito, muito errado.
Divulgação, tenho quase 20 anos de experiência em empresas de todos os tamanhos. E sim, eu vi arquiteturas monolíticas e distribuídas de perto e pessoalmente. É com base nessa experiência que estou lhe dizendo que uma arquitetura de microsserviço distribuído é realmente algo que você faz porque precisa, e não porque é, de alguma forma, mais limpo e melhor.