Vantagens e Desvantagens de uma arquitetura de Microsserviços

Imagine que você está prestes a lançar um software para um e-commerce ou uma startup . Você já se pegou pensando: “Devo começar com um monolito ou já iniciar com microsserviços?” 🤔

Essa é, de fato, uma pergunta difícil de responder, pois não há uma solução absolutamente certa ou errada. A decisão deve sempre considerar fatores como tempo, custo, habilidades da equipe e, acima de tudo, as necessidades do time de negócios. Afinal, a tecnologia existe para servir ao negócio. Como costumo dizer nas aulas do CAD: não se trata apenas de tecnologia, mas de como utilizá-la para alcançar os objetivos da empresa.

Aqui estão alguns pontos essenciais que você deve considerar antes de escolher sua arquitetura:

Escalabilidade

  • Microsserviços permitem escalar apenas os componentes que realmente precisam de mais recursos, otimizando custos e desempenho. Por exemplo, um serviço de checkout pode ser escalado separadamente durante a Black Friday, sem precisar aumentar toda a infraestrutura.
  • Monolitos são mais fáceis de escalar no início, pois exigem menos configuração. No entanto, conforme a aplicação cresce, pode ser necessário aumentar verticalmente o servidor (mais CPU e memória), o que tem um limite físico e pode se tornar caro e ineficiente. Além disso, como todos os módulos compartilham os mesmos recursos, fica difícil controlar o consumo individual de cada funcionalidade. Por exemplo, se o processamento de pedidos começar a consumir muita CPU, isso pode degradar o desempenho de toda a aplicação, afetando até funcionalidades não relacionadas, como o login ou o catálogo de produtos.

Isolamento

  • Em microsserviços, falhas ficam contidas dentro do serviço afetado, evitando que todo o sistema saia do ar (é uma verdade se vc arquitetar direito né ?! pois em arquiteturas distribuídas novos problemas surgem). Por exemplo, se um serviço de notificações por e-mail falhar, o restante da aplicação, como login e checkout, continua funcionando normalmente.
  • No monolito, um erro crítico pode derrubar toda a aplicação. Por exemplo, uma exceção não tratada no módulo de pagamentos pode causar a falha do sistema inteiro, impactando todas as funcionalidades e usuários ao mesmo tempo.

Autonomia

  • Com microsserviços, cada equipe pode desenvolver e lançar suas partes da aplicação de forma independente, adotando estratégias de deploy e testes que fazem sentido para o seu contexto. Por exemplo, o serviço de checkout pode ser implantado com canary deployment, liberando a nova versão apenas para uma pequena parcela dos usuários antes de expandir para todos. Enquanto isso, o frontend pode rodar testes A/B, comparando diferentes versões da interface para avaliar qual gera melhor conversão.
  • No monolito, as mudanças precisam ser alinhadas entre os times antes do deploy, e geralmente é necessário seguir um modelo único que atenda a todas as funcionalidades. Isso significa que qualquer atualização, por menor que seja, exige um novo deploy da aplicação inteira, dificultando testes incrementais e estratégias de rollout controlado.

Comunicação

  • Microsserviços dependem de APIs bem definidas para uma comunicação eficiente, geralmente via REST, gRPC ou mensageria. Isso permite que cada serviço evolua de forma independente, sem impactar diretamente os demais. Por exemplo, um serviço de pagamentos pode ser atualizado ou até substituído por um provedor externo sem que o restante da aplicação precise mudar, desde que a API continue compatível. No entanto, uma comunicação distribuída pode gerar desafios, como latência e necessidade de observabilidade avançada para rastrear fluxos complexos entre serviços.
  • No monolito, a comunicação entre módulos ocorre diretamente dentro da aplicação, usando chamadas de função ou acessos diretos ao banco de dados. Isso torna a interação mais rápida e simples, sem depender de redes externas. No entanto, esse acoplamento rígido significa que mudanças em um módulo podem impactar outros de forma imprevisível. Por exemplo, se o módulo de checkout precisar mudar a estrutura de dados do carrinho, diversos outros módulos podem ser afetados, exigindo grandes refatorações.

Infraestrutura

  • Microsserviços demandam orquestração e um gerenciamento mais complexo, já que envolvem múltiplos serviços rodando em conjunto. Por exemplo, um sistema pode precisar de Kubernetes para gerenciar dezenas de serviços independentes.
  • Monolitos são mais simples de operar no início, podendo rodar facilmente em um único ambiente, como uma única instância EC2 ou um servidor tradicional.

Observabilidade / Operacionalidade

  • Microsserviços exigem um alto nível de maturidade em observabilidade, mas oferecem uma visão mais granular do comportamento de cada serviço. Como os microsserviços são desacoplados, funcionalidades como distributed tracing se tornam essenciais para monitoramento, o que adiciona complexidade e overhead operacional.
  • Monolitos são mais fáceis de gerenciar no início e possuem logs mais simples e padronizados, já que toda a aplicação compartilha a mesma fonte de registro. No entanto, medir o consumo exato de cada funcionalidade pode ser desafiador.

Lançamento

  • Em microsserviços, cada serviço pode ser lançado separadamente, permitindo deploys incrementais sem afetar toda a aplicação. Por exemplo, um time pode atualizar apenas o serviço de autenticação sem impactar os demais.
  • No monolito, o release é único, o que significa que qualquer atualização exige um novo deploy da aplicação inteira, aumentando o risco de falhas e impactos maiores.

Agilidade

  • Microsserviços permitem entregas contínuas e rápidas, pois cada equipe pode desenvolver, testar e implantar suas mudanças de forma independente. Por exemplo, um time pode atualizar apenas um serviço de pagamento sem precisar esperar por uma nova versão da aplicação inteira.
  • No monolito, o ciclo de desenvolvimento tende a ser mais longo, já que qualquer alteração precisa passar por testes e deploys que envolvem toda a aplicação, aumentando o tempo de entrega.

Resiliência

  • Microsserviços podem ser mais resilientes a falhas, pois operam de forma distribuída. Se um serviço específico, como o de pagamentos, falhar, os demais continuam funcionando, garantindo que outras funcionalidades, como login e catálogo de produtos, permaneçam ativas.
  • Monolitos também podem ter mecanismos de resiliência, mas o blast radius é muito maior. Se um componente crítico falhar, como a gestão de pedidos, toda a aplicação pode ficar indisponível, impactando diretamente todos os usuários.

Poliglota

  • Microsserviços permitem que cada serviço seja desenvolvido com a tecnologia mais adequada para sua função. Por exemplo, um serviço de processamento de dados em tempo real pode ser escrito em Python por conta das bibliotecas especializadas, enquanto um serviço de autenticação pode ser feito em Go para maior desempenho e menor consumo de memória. Isso dá mais flexibilidade, mas também aumenta a complexidade de gerenciamento.
  • Monolitos geralmente são construídos com uma única stack tecnológica, o que simplifica o desenvolvimento e a manutenção. No entanto, isso pode limitar a escolha da melhor ferramenta para cada necessidade. Por exemplo, se um monolito for escrito em Java, todo o time precisará seguir essa stack, mesmo que existam linguagens mais eficientes para determinadas funções.(Infelizmente já vi muito disso e me dói a complexidade java hehehe – sorry se vc é um dev java, mas a verdade precisa ser dita 👀)

Custo

  • Microsserviços podem exigir mais infraestrutura e um time de DevOps mais especializado. Cada serviço pode precisar de containers, balanceadores de carga, observabilidade distribuída e escalonamento independente, o que aumenta os custos operacionais. Por exemplo, rodar um cluster Kubernetes para gerenciar dezenas de microsserviços pode ser mais caro do que manter um monolito em algumas instância EC2.
  • Monolitos são mais baratos para iniciar, pois podem rodar em um único servidor com menos complexidade operacional. No entanto, à medida que a aplicação cresce, escalar um monolito pode se tornar caro e ineficiente, exigindo máquinas mais potentes e com maior capacidade, o que pode aumentar os custos de infraestrutura a longo prazo.

Não existe resposta certa ou errada, apenas o que faz mais sentido para o seu projeto e o seu negócio. Se você está começando pequeno, sua equipe não tem as habilidades necessárias para provisionar uma infra de qualidade para atender todos seus microsservicos, talvez o monolito seja a melhor opção. Agora, Se você já prevê um grande crescimento e necessidade de escalabilidade, isolamento, customizações e compartilhamento de responsabilidades, microsserviços podem ser o caminho.

E você, já passou pela decisão entre microsserviços e monolitos? Quais foram os maiores desafios no dia a dia? Me conte sua experiência! Quero entender os tradeoffs e desafios que você enfrentou e, quem sabe, compartilhar seus insights valiosos em uma próxima newsletter!


Aproveitando, Se você curte conteúdos como esse e quer aprender os padrões e as práticas para criar e manter sistemas escaláveis, resilientes e modernos, ao mesmo tempo que se torna uma autoridade no assunto, te convido a fazer parte da Comunidade de Arquitetura Descomplicada (CaD). Saiba mais em https://mugnos-it.com/cad/

guest
0 Comentários
Mais Velhos
Mais Novos Mais Votados
Inline Feedbacks
Veja todos comentários
0
Gostaria muito de saber sua opinião!x