Monolito, Arquitetura em Camadas e Microsserviços

A maioria dos sistemas começa como um monólito. E não tem problema algum nisso. O problema é quando o monólito cresce sem nenhuma organização interna, e o time começa a gastar mais tempo desvendando dependências ocultas do que entregando funcionalidades.

Este post cobre a evolução natural das arquiteturas de software — do monólito para a arquitetura em camadas e, em determinados contextos, para microsserviços — com ênfase nos trade-offs reais de cada abordagem.


Visão Geral

Diagrama animado — Monólito, Camadas e Microsserviços


1. Monólito

Uma aplicação única, com todas as funcionalidades, que roda e é implantada como um bloco só.

Quando usar

Vantagens

Desafios

Boas práticas


2. Arquitetura em Camadas (Layered)

Estilo de organização interna que pode ser aplicado tanto em monólitos quanto em microsserviços. Não é um tipo de deploy — é uma forma de estruturar o código.

Camadas típicas

  1. Apresentação (UI/API): controllers, validações, DTOs.
  2. Aplicação/Serviços: orquestra casos de uso.
  3. Domínio (Core): entidades, regras de negócio, policies.
  4. Infraestrutura: persistência, mensageria, APIs externas.

Benefícios

Cuidados


3. Microsserviços

Conjunto de serviços pequenos e autônomos, cada um dono do próprio banco e alinhado a um subdomínio de negócio específico.

Quando faz sentido

Vantagens

Desafios

Boas práticas


4. Comparativo

Critério Monólito Microsserviços
Time-to-market inicial Excelente Bom (overhead de setup)
Complexidade Baixa Alta
Escalabilidade Fraca (escala tudo) Forte (por serviço)
Deploy independente Não Sim
Consistência Forte (ACID) Eventual (Sagas)
Tamanho de equipe Pequena Média/Grande
Custos iniciais Baixos Altos
Evolução longo prazo Pode degradar Alta (se bem governada)

5. Estratégias de Migração

Migrar de monólito para microsserviços não é um projeto de fim de semana. As estratégias mais usadas:


6. Banco de Dados em Microsserviços

SQL (Relacional)

Bancos como PostgreSQL, MySQL e SQL Server são ideais para sistemas que exigem integridade transacional.

Quando usar: pagamentos, pedidos, autenticação — qualquer fluxo onde a consistência forte é inegociável.

NoSQL (Não Relacional)

Bancos como MongoDB, Cassandra e Redis oferecem flexibilidade e escalam bem em ambientes distribuídos.

Quando usar: catálogos de produtos, sessões, dados de IoT, histórico de eventos.

Teorema CAP

Todo sistema distribuído precisa escolher entre duas das três propriedades:

Propriedade Descrição
Consistência (C) Todos os nós veem os mesmos dados ao mesmo tempo.
Disponibilidade (A) O sistema sempre responde, mesmo com falhas.
Tolerância a Partições (P) O sistema continua operando mesmo que partes da rede falhem.

Bancos SQL priorizam Consistência + Disponibilidade. Bancos NoSQL priorizam Disponibilidade + Particionamento, aceitando consistência eventual.

Padrões para dados distribuídos

Database per Service — cada microsserviço tem seu próprio banco. Nunca banco compartilhado entre domínios. Isso garante autonomia de deploy e escala independente.

CQRS (Command Query Responsibility Segregation) — separa as operações de escrita (commands) das de leitura (queries). Permite otimizações específicas para cada tipo: banco relacional para escrita, Elasticsearch para leitura, por exemplo.

Event Sourcing — cada mudança de estado é registrada como um evento imutável. A aplicação reconstrói seu estado a partir desses eventos. Garante rastreabilidade total e histórico auditável.

Sagas — coordenam transações distribuídas usando eventos assíncronos. Cada etapa tem uma ação compensatória caso algo falhe, garantindo consistência eventual sem bloqueios distribuídos (2PC).


7. Comunicação entre Microsserviços

A forma como os serviços se comunicam define a qualidade do sistema inteiro. Existem três modelos principais.

Diagrama animado — Comunicação entre Microsserviços

Comunicação Síncrona (REST / gRPC)

O cliente faz uma requisição e espera pela resposta. É o modelo clássico — simples, direto e previsível.

REST / HTTP é o mais comum. Simples de implementar, bem suportado em qualquer linguagem, mas cria acoplamento temporal: se o servidor cai, o cliente também quebra.

gRPC é mais moderno e performático. Usa serialização binária (Protocol Buffers), suporta streams bidirecionais e define contratos fortemente tipados. Mais rápido que JSON/REST e ideal para comunicação interna entre microsserviços. A desvantagem é a complexidade maior e dificuldade de expor diretamente para o frontend.

Quando usar: operações críticas em tempo real onde a resposta importa imediatamente — consultas de saldo, validação de pagamento, autenticação.

Comunicação Assíncrona (Kafka / RabbitMQ)

O cliente envia uma mensagem e não espera resposta. O servidor processa quando puder, usando filas ou streams.

Tecnologias: Kafka, RabbitMQ, AWS SQS, NATS, Pulsar.

Vantagens: desacoplamento temporal, alta resiliência, absorve picos de tráfego. Se um consumidor cai, as mensagens ficam na fila até ele voltar.

Desafios: exige infraestrutura de broker, tratamento de retries, deduplicação e Dead Letter Queue (DLQ). Debug mais complexo — tracing distribuído é obrigatório.

Quando usar: propagação de eventos, notificações, processamento em background — qualquer fluxo onde o produtor não precisa esperar o resultado.

API Gateway

Um ponto único de entrada que recebe, roteia e controla as requisições para os microsserviços internos. Exemplos: Kong, Traefik, Apigee, Amazon API Gateway.

O gateway centraliza: autenticação e autorização, rate limiting, transformação de payloads, métricas e observabilidade.

O risco é virar um ponto único de falha — precisa de alta disponibilidade e bom monitoramento.

Padrão híbrido (REST + Mensageria)

Na prática, os sistemas saudáveis usam os dois modelos:

Exemplo: pedido criado via REST → evento PedidoCriado publicado no Kafka → estoque, faturamento e notificação consomem de forma independente.


8. Anti-padrões


9. Quando Migrar para Microsserviços

Manter o Monólito se

Migrar para Microsserviços se


Conclusão

Comece com monólito modular em camadas. Organize o código internamente, defina bounded contexts, mantenha boa cobertura de testes. Evolua para microsserviços onde realmente existe dor — escala, autonomia de equipe, deploys independentes.

A tendência do mercado não é escolher um modelo e ficar nele para sempre. É entender que cada parte do sistema pode ter uma arquitetura diferente, e que a decisão certa depende da maturidade do domínio, do tamanho do time e da carga real.

Arquitetura é sobre trade-offs. Toda escolha tem custo. A pergunta não é “qual é a melhor arquitetura?”, mas “qual é a melhor arquitetura para esse contexto, agora?”.


Referências