Série: Além do Hype — Artigo 05 (Epílogo)

O Caminho do Meio — O Monolito Modular e Extração

Arquitetura pragmática para a segunda-feira: como estruturar o seu sistema hoje sem acumular dívidas operacionais na nuvem.

O Caminho do Meio: Monolito Modular e Extração
Capa do epílogo: o bloco modular sendo extraído de forma cirúrgica da estrutura de pedra unificada, ilustrando o padrão Strangler Fig.

Chegamos ao encerramento da nossa jornada. Após cruzar os incentivos psicológicos do mercado de trabalho, a matemática rígida de redes, o desenho organizacional de Conway e a realidade financeira das nuvens públicas, precisamos traçar a estratégia prática para os projetos da próxima segunda-feira.

A pergunta correta que um arquiteto de software sênior deve fazer nunca é "Qual arquitetura é melhor?", mas sim "Qual o preço operacional e financeiro que a minha organização precisa e consegue pagar neste momento?".

Uma Micro-História Realista

Considere o caso de uma plataforma de gestão de estoques que tentou, ao longo de seis meses, dividir seu sistema central unificado em microsserviços sem sucesso, devido a conflitos de integridade no banco. Percebendo a perda de foco, a engenharia freou o projeto e decidiu primeiro refatorar o código interno como um Monolito Modular. Após isolarem rigidamente os módulos em Java e separarem as regras lógicas de Faturamento, uma pequena equipe de apenas quatro desenvolvedores realizou a extração real da API de faturamento como um serviço independente em três semanas.

O impacto foi imediato: o tempo de entrega (lead time) de atualizações fiscais caiu de duas semanas para apenas três dias, o custo geral de infraestrutura reduziu-se em 60% com o enxugamento de recursos e os incidentes de travamento de banco de dados por concorrência foram eliminados por completo do ambiente produtivo.

1. O Ponto de Partida Ideal: O Monolito Modular

A melhor estratégia para contornar a sobre-engenharia sem abrir mão da flexibilidade futura é começar o projeto utilizando um Monolito Modular.

Nesta abordagem, toda a aplicação roda sob um único processo executável e utiliza um único banco de dados. Contudo, no código, as dependências são organizadas de forma rigorosa em módulos independentes (usando pacotes Java bem estruturados, regras de arquitetura hexagonal ou ferramentas de validação de dependências como ArchUnit).

Pipeline de Evolução Arquitetural

[Monolito Modular] ➔ (Isolamento de Módulos) ➔ (Validação Estática) ➔ (Proxy de Roteamento) ➔ (Extração) ➔ (Banco Independente) ➔ (Sincronização Assíncrona) ➔ (Corte Final)

Isso permite que a equipe programe com a velocidade de desenvolvimento de um monolito (compilação rápida, facilidade para rodar testes na própria máquina, ausência de latência de rede), mas garanta o isolamento lógico das funcionalidades de negócio.

Como provar o isolamento de pacotes na prática

  1. Testes de Arquitetura com ArchUnit: Escreva testes que asseguram de forma automatizada na build que classes do pacote 'Faturamento' não podem importar classes internas de 'Estoque'.
  2. Análise de Acoplamento Estático: Monitore as métricas de acoplamento (Fan-in e Fan-out) para garantir que os módulos dependam apenas de fachadas/interfaces públicas bem definidas.
  3. Impedir Imports Proibidos: Configure validações estáticas no pipeline de CI/CD para rejeitar commits que quebrem os limites lógicos do design.

Erro comum: Permitir que pacotes internos de um módulo importem classes internas de outros módulos diretamente, contornando as fachadas públicas (interfaces/APIs internas) e quebrando o isolamento.

Resumo intermediário: Começar com um monolito modular bem estruturado elimina a complexidade física da rede no primeiro dia, preservando a capacidade de fatiar o sistema no futuro se a volumetria exigir.

2. O Padrão da Figueira Estranguladora (Strangler Fig Pattern)

Se, ao longo do crescimento da empresa, a volumetria de um módulo específico disparar drasticamente ou exigir deploys isolados de uma equipe independente, a transição para microsserviços ocorre de forma cirúrgica utilizando o Strangler Fig Pattern (Padrão da Figueira Estranguladora).

Alguns candidatos ideais para a extração cirúrgica incluem:

  • Módulo de Faturamento / Fiscal: Devido à alta frequência de mudanças regulatórias e fiscais exigindo deploys rápidos.
  • Motor de Antifraude / Recomendação: Devido a picos extremos de processamento ou necessidade de processamento pesado em paralelo.
  • Módulo de Catálogo / Busca: Por receber o maior volume de tráfego de leitura ociosa no dia a dia.

Em vez de reescrever todo o sistema do zero — o que geralmente resulta em fracassos comerciais catastróficos —, a equipe isola gradualmente o módulo selecionado no monolito. Cria-se uma nova aplicação independente na rede e, através de um proxy de roteamento, o tráfego é direcionado aos poucos do monolito antigo para o novo serviço. Com o tempo, a parte antiga do monolito seca e é removida de forma segura.

Erro comum: Tentar estrangular ou reescrever a aplicação inteira em um único ciclo massivo ("Big Bang"), em vez de extrair endpoints ou fluxos isolados de forma incremental.

3. O Desafio Silencioso da Decomposição do Banco de Dados

O maior erro técnico na extração de um microsserviço é esquecer de separar os dados. Se dois microsserviços distintos continuam compartilhando as mesmas tabelas no mesmo banco de dados relacional centralizado, a separação do código foi inútil. Você mantém os custos de rede das APIs, mas preserva o acoplamento físico de dados, impedindo deploys independentes.

A sincronização segura entre os bancos independentes deve ser tratada de forma assíncrona:

  • Eventos de Domínio: O monolito notifica as alterações gerando mensagens para tópicos/filas assíncronas.
  • Change Data Capture (CDC): Escuta as alterações físicas de dados diretamente na tabela e as propaga ao novo banco em milissegundos sem acoplamento de código.

Erro comum: Manter chaves estrangeiras físicas (foreign keys) e junções relacionais de tabelas entre bancos de dados que passarão a rodar em servidores diferentes.

Resumo intermediário: Extrair um serviço sem separar seu respectivo banco de dados gera acoplamento oculto e fragilidade técnica. Se o dado é compartilhado na mesma tabela, o sistema ainda é um monolito, só que espalhado na rede.

4. Conclusão da Série: O Caminho Pragmático

O monolito cobra o seu preço em acoplamento de código a longo prazo se a equipe não for disciplinada com a organização dos pacotes; o microsserviço cobra o seu preço em complexidade de infraestrutura e custos em dólar desde o primeiro dia de vida do sistema.

Para a esmagadora maioria das empresas de médio porte, investir na organização interna do código (monolitos modulares) trará muito mais retorno sobre o investimento do que fragmentar a infraestrutura de servidores de forma prematura. Engenharia sênior envolve resolver problemas com o menor número possível de partes móveis.

Quando NÃO extrair um microsserviço

  • Volumetria Uniforme: Se o tráfego do sistema é estável e equilibrado entre as áreas.
  • Equipe Pequena: Se você possui menos de 25 desenvolvedores focados em manter a entrega.
  • Domínio Instável: Se as regras de negócio de Faturamento ou Estoque ainda mudam a cada semana.
  • Sem Dono Claro: Se a equipe de engenharia não possui equipes independentes para assumir a custódia exclusiva do novo serviço.

Checklist: Preparado para a Extração?

  • [ ] 1. Conseguimos rodar testes e provar o isolamento do módulo dentro do monolito com ferramentas automáticas?
  • [ ] 2. Eliminaram todas as foreign keys físicas e dependências diretas de tabelas no banco entre o módulo e o restante do sistema?
  • [ ] 3. Conseguimos desviar tráfego de forma gradual através de um proxy/gateway (Strangler Fig)?
  • [ ] 4. A equipe está ciente das mudanças e preparada para operar o novo banco de dados independente e de forma assíncrona?

Conclusão da Série

A modularidade é o investimento sustentável em engenharia; a extração é o dividendo pago pela maturidade do negócio. A arquitetura correta é aquela que otimiza o custo e a produtividade da próxima segunda-feira.

"A modularidade é o investimento; a extração é o dividendo. Não existe microsserviço saudável sem um monolito modular bem estruturado por baixo."

Agradecemos a leitura ao longo desta minissérie de reflexões e cálculos arquiteturais.

— Fim da Série. Volte ao Índice da Série para rever os episódios ou acesse a página inicial do blog.

Glossário do Episódio 05

ArchUnit: Uma biblioteca de código aberto simples para Java que permite validar e testar regras de arquitetura e dependências de pacotes por meio de testes de unidade automatizados padrão JUnit.

Arquitetura Hexagonal: Padrão de design de software que separa o núcleo de regras de negócio das tecnologias externas (como banco de dados e interfaces web) por meio de portas e adaptadores, garantindo alto isolamento e testabilidade.

Change Data Capture (CDC): Técnica de captura automática que escuta e propaga alterações feitas nas tabelas de banco de dados (inserções ou atualizações) em tempo real para outros sistemas, sem acoplamento de código.

Decomposição de Banco de Dados: O processo de dividir um banco de dados compartilhado centralizado em esquemas ou bancos de dados isolados e exclusivos para cada serviço na rede, eliminando acoplamentos físicos.

Eventos de Domínio: Mensagens assíncronas disparadas pelo sistema para avisar que um acontecimento importante para o negócio ocorreu (por exemplo: "Nota Fiscal Emitida"), permitindo que outros módulos reajam de forma independente.

Fan-in e Fan-out: Métricas de acoplamento de código. Fan-in indica quantas classes ou módulos dependem do código em questão, enquanto Fan-out indica de quantas dependências externas o próprio código precisa para executar.

Refatoração Arquitetural: O ato de alterar a estrutura física e lógica de alto nível de um sistema de software sem modificar o seu comportamento externo visível, visando melhorar a manutenção e a escalabilidade.

Strangler Fig Pattern (Padrão da Figueira Estranguladora / Contexto Histórico): Nomeado pelo renomado arquiteto Martin Fowler em 2004, após ele observar a forma como as figueiras estranguladoras crescem em florestas tropicais da Austrália. Elas se aninham nos galhos superiores de uma árvore hospedeira, descem suas raízes até o solo aos poucos e, gradualmente, envolvem e substituem a árvore original por completo. No desenvolvimento de software, representa a migração gradual de sistemas antigos direcionando tráfego aos poucos para o novo código.

Tags de compartilhamento:
#ModularMonolith #SoftwareDesign #Microservices #TechArchitecture