Monólitos x Microserviços

Para entender a diferença entre Monólitos e Microsserviços, a melhor forma é imaginar a organização de uma cozinha, desde uma pequena lanchonete até a praça de alimentação de um shopping.

Imagine um restaurante. Num monólito, existe um único chef que anota o pedido, cozinha, serve e lava a louça, tudo numa cozinha só. É simples, eficiente para começar, mas se o chef adoecer, o restaurante para.

Num sistema de microserviços, há especialistas: um maître, um garçom, um grelheiro, um confeiteiro e um lavador de louças, cada um faz sua parte de forma independente, se comunicando para entregar o prato ao cliente. Mais complexo de coordenar, mas muito mais resiliente e escalável.

O Monólito: A “Cozinha de um único Chef”

No modelo monolítico, toda a aplicação é construída como uma unidade única e indivisível. Todas as funções (pedidos, pagamentos, estoque, entrega) estão no mesmo código, rodam no mesmo servidor e compartilham o mesmo banco de dados.

Como funciona na prática: Imagine um pequeno restaurante onde o mesmo chef recebe o pedido, cozinha, lava a louça e faz o caixa.

Repare que os três módulos internos vivem dentro do mesmo processo. Um bug em “Acesso a dados” pode derrubar a “Apresentação”. Um deploy de qualquer módulo exige redeployar o sistema inteiro.

Vantagens do monólito:

É muito simples de começar. É fácil de testar e colocar no ar (deploy), pois é apenas um “pacote”.

  • Simples de desenvolver no início um único projeto, uma única base de código
  • Fácil de testar localmente
  • Sem latência de rede entre módulos (chamadas são em memória)
  • Deploy simples: um artefato, um servidor

Desvantagens do monólito:

Se o restaurante lota e você precisa de mais agilidade na cozinha, você não consegue contratar “apenas um cozinheiro”. Você teria que clonar o restaurante inteiro (com caixa, pia e balcão novos) só para fritar mais batatas. Se o chef tropeça e se machuca, o restaurante inteiro para.

  • Qualquer falha pode derrubar tudo
  • Escalar exige replicar a aplicação inteira, mesmo que só uma parte precise de mais recursos
  • Times grandes brigam pela mesma base de código
  • Com o tempo, o código fica acoplado e difícil de manter (o famoso “big ball of mud”)

Microsserviços: A “Praça de Alimentação”

Na arquitetura de microsserviços, a aplicação é dividida em vários pequenos serviços independentes que se comunicam entre si (geralmente via APIs ou Mensageria). Cada serviço cuida de uma única função de negócio e pode ter seu próprio banco de dados e tecnologia.

Eles se comunicam via HTTP/REST, gRPC ou mensageria (Kafka, RabbitMQ).

Como funciona na prática: Imagine uma praça de alimentação. Existe um quiosque só para Bebidas, um só para Hambúrgueres e um Totem central para Pagamentos.

Cada serviço é completamente independente. O serviço de Pedidos pode cair sem afetar o de Produtos. Você pode escalar só o serviço de Pagamentos em datas como Black Friday, sem tocar nos outros.

Vantagens dos microserviços:

Se a demanda por hambúrgueres aumenta, você coloca mais chapas apenas naquele quiosque, sem mexer no setor de bebidas. Se o sistema de bebidas der erro, as pessoas ainda conseguem comprar comida e pagar.

  • Escalabilidade granular: escale só o que precisa
  • Falhas são isoladas: um serviço cai sem derrubar os outros
  • Times podem trabalhar de forma independente em serviços diferentes
  • Cada serviço pode usar a linguagem e o banco de dados mais adequados para seu problema
  • Deploy independente por serviço

Desvantagens dos microserviços:

Agora você precisa de uma logística complexa para que os pedidos cheguem corretamente de um quiosque ao outro. A comunicação entre os serviços é o ponto mais difícil de gerenciar.

  • Complexidade operacional muito maior (Kubernetes, service mesh, monitoramento distribuído)
  • Latência de rede nas chamadas entre serviços
  • Transações distribuídas são difíceis (não tem BEGIN TRANSACTION entre bancos diferentes)
  • Debugging é mais difícil: um erro pode atravessar 5 serviços
  • Overhead de infraestrutura significativo

Comparativo Direto

CaracterísticaMonólitoMicrosserviços
DesenvolvimentoSimples e rápido no início.Lento e complexo para configurar.
EscalabilidadeVertical (precisa de uma máquina maior).Horizontal (adiciona mais máquinas pequenas).
FalhasUma falha pode derrubar o sistema todo.Falhas são isoladas em um serviço.
TecnologiaUma única stack (ex: Tudo em Java).Cada serviço pode usar uma linguagem diferente.
DeploymentAtualiza tudo de uma vez.Atualiza cada peça independentemente.

O ponto crítico que ninguém conta: A falácia do “começa com microserviços”

Um erro clássico é começar um projeto novo já com microserviços. O problema é que você ainda não sabe onde estão as fronteiras naturais do seu domínio. Martin Fowler chama isso de “distributed monolith”: você tem toda a complexidade dos microserviços, sem nenhum dos benefícios os serviços ficam tão acoplados que um deploy de um exige deploy de todos os outros.

A abordagem recomendada é começar com um monólito bem estruturado e extrair microserviços conforme a necessidade real aparecer.

CritérioMonólitoMicroserviçosVence
Complexidade inicialBaixa. Um projeto, um deploy, um banco.Alta. Orquestração, rede, monitoramento distribuído.Monólito
EscalabilidadeEscala a aplicação inteira, mesmo que o gargalo seja um módulo só.Escala apenas o serviço que precisa de mais recursos.Micro
ResiliênciaFalha num módulo pode derrubar tudo.Falhas são isoladas por serviço.Micro
Velocidade de devRápido no início. Lento quando o código cresce e fica acoplado.Lento no início (infra). Rápido quando times são grandes e independentes.Depende
DeployUm artefato. Simples, mas qualquer mudança exige redeployar tudo.Deploy independente por serviço. Risco menor por mudança.Micro
DebuggingStack trace local. Fácil de reproduzir.Trace distribuído. Precisa de ferramentas como Jaeger, Zipkin.Monólito
TransaçõesACID nativo com um banco. Rollback trivial.Sem transações distribuídas nativas. Precisa de Saga pattern.Monólito
Custo de infraBaixo. Um ou poucos servidores.Alto. Kubernetes, service mesh, múltiplos bancos, observabilidade.Monólito
Tamanho do timeIdeal para times pequenos (1–15 devs).Justificado com times grandes e múltiplos squads independentes.Depende

Qual escolher?

  • Escolha Monólito se: Você está criando um MVP (Produto Mínimo Viável), tem uma equipe pequena ou a aplicação não é absurdamente complexa. Dica: Comece como um “Monólito Modular” bem organizado.
  • Escolha Microsserviços se: Sua aplicação é gigante (nível Netflix, Uber ou Nubank), você tem dezenas de times de desenvolvedores e precisa escalar partes diferentes do sistema de forma independente.

Existe uma heurística simples que resume bem quando migrar:

Fique no monólito enquanto: O time for pequeno, o produto ainda estiver buscando product-market fit, ou você conseguir deployar sem travar outros times.

Considere microserviços quando: Times diferentes estão se bloqueando para deployar, uma parte do sistema tem exigências de escala radicalmente diferentes das outras (ex: serviço de busca vs serviço de autenticação), ou a resiliência de partes críticas vira um requisito de negócio.

Netflix, Amazon e Uber não começaram com microserviços, todos começaram como monólitos e migraram conforme a necessidade. Isso diz muito sobre a ordem certa de fazer as coisas.

Compartilhe nas redes sociais:
Alexandre Polselli
Alexandre Polselli

Escrevo artigos e desenvolvo projetos nas minhas áreas de maior interesse: Engenharia de Dados e Data Science.

Artigos: 56