Monolito Primeiro: Por Que Microsservicos Sao a Escolha Errada Para 90% das Startups

Produtos gratuitos e pagos para transformar ideias em uma base que você consegue executar.
13 produtos disponíveisContinue explorando tópicos similares

Em 2025, eu trabalhei 14 horas por dia durante 3 meses seguidos. Por FOMO. O resultado? Insonia. Irritabilidade. Zero criatividade. É a ironia: minha produtividade CAIU. Esse artigo de 65 minutos tem 20+ pesquisas, 7 pilares e um plano de 12 semanas para sair do burnout de forma sustentável.

App Router e Pages Router parecem uma discussão de moda, mas a diferença real está em modelo mental, limites entre servidor e cliente, cache, streaming, SEO, DX e custo de migração. Este guia mostra quando migrar, quando ficar e como evitar uma escolha cara demais para o seu produto.

Guia robusto para aplicar Dependency Inversion Principle com ports and adapters, React Context, contract tests e observabilidade de adapters em produção.
Checklist de 47 pontos para encontrar bugs, riscos de segurança e problemas de performance antes do lançamento.
Templates testados em produção, usados por desenvolvedores. Economize semanas de setup no seu próximo projeto.
English summary: Microservices have become the default architecture for startups, but this is a costly mistake for 90% of them. This article dismantles the microservices hype with real data, reverse-migration case studies, and a practical decision framework. It argues that a well-structured modular monolith is the optimal starting point, and microservices should only be adopted when concrete pain signals justify the complexity.
Publicado em: Fevereiro de 2026 Tempo de leitura: 22 minutos Palavras-chave: #MonolitoPrimeiro #Microsservicos #ArquiteturaDeSoftware #Startups #MonolitoModular #DDD #Kubernetes #OverEngineering #Escalabilidade
Imagine a cena.
E segunda-feira de manha em uma startup de fintech em Sao Paulo. O time de engenharia — seis desenvolvedores — esta em uma call de emergencia. O servico de notificacoes parou de responder as 3h da manha, o que causou um efeito cascata no servico de pagamentos, que derrubou o servico de autenticacao. Tres servicos fora do ar. Nenhum deles tinha problema isoladamente. O problema estava na rede entre eles.
O CTO, que seis meses antes tinha convencido os fundadores de que microsservicos eram "a unica forma de escalar", agora olha para um dashboard do Grafana com 47 paineis, tentando entender por que uma requisicao que deveria levar 50ms esta levando 4 segundos enquanto pula entre 7 servicos diferentes.
O detalhe? A startup tem 200 usuarios ativos.
Duzentos.
Esse cenario nao e ficticio. E um compilado de situacoes reais que vi acontecer dezenas de vezes nos ultimos anos. Times pequenos, com produto ainda em validacao, gastando meses construindo infraestrutura para problemas que nao existem — e criando problemas novos no processo.
A industria de software tem um problema de cargo cult. Lemos que a Netflix usa microsservicos. Lemos que a Amazon migrou para microsservicos. E concluimos: "Se funciona para eles, funciona para nos."
So que esquecemos um detalhe fundamental: a Netflix tem mais de 2.000 engenheiros. A Amazon tem mais de 10.000. Voce tem seis.
Este artigo nao e contra microsservicos. Microsservicos sao uma ferramenta poderosa — no contexto certo. Este artigo e contra a adocao cega de microsservicos como default, contra o dogma de que monolito e "legado" e micro e "moderno", e a favor de uma decisao arquitetural baseada em evidencia, nao em hype.
Vamos desmontar essa narrativa. Com dados, exemplos reais e um framework pratico para voce tomar a decisao certa para o SEU contexto.
Em algum momento entre 2014 e 2018, a industria criou uma equacao simples:
Monolito = velho, lento, desorganizado. Microsservicos = novo, rapido, escalavel.
Essa equacao esta errada. E perigosamente errada.
Monolito nao significa codigo espaguete. Monolito significa que sua aplicacao roda como um unico processo deployavel. Ponto. Nada mais. Um monolito pode ser perfeitamente organizado, modular, testavel e escalavel. Da mesma forma, microsservicos podem ser uma bagunca distribuida — o que e infinitamente pior que uma bagunca centralizada, porque agora voce precisa de ferramentas especializadas ate para entender ONDE esta a bagunca.
A confusao acontece porque muitos desenvolvedores conheceram monolitos mal feitos — aplicacoes legadas sem separacao de responsabilidades, com acoplamento forte e deploy manual. E associaram os problemas da implementacao ruim com a arquitetura em si.
Isso e como dizer que carros sao perigosos porque voce viu alguem dirigindo sem freio. O problema nao e o carro. E a manutencao.
Vamos corrigir as definicoes:
| Conceito | O que realmente significa |
|---|---|
| Monolito | Uma unidade de deployment. Pode ser modular internamente. |
| Microsservicos | Multiplas unidades de deployment independentes, comunicando via rede. |
| Monolito legado | Um monolito mal estruturado com acoplamento forte. NAO e sinonimo de monolito. |
| Monolito modular | Um monolito com limites claros entre modulos, baixo acoplamento e alta coesao. |
A pergunta certa nao e "monolito ou micro?". A pergunta certa e: "Qual e a menor quantidade de complexidade arquitetural que resolve meu problema atual?"
E para 90% das startups, a resposta e um monolito.
Quando alguem propoe microsservicos, geralmente lista os beneficios: escalabilidade independente, deploys isolados, times autonomos, liberdade de tecnologia.
Sao beneficios reais. Mas vem com um preco que raramente aparece na proposta. Vamos olhar a fatura completa.
Em um monolito, uma chamada de funcao leva nanosegundos. Em microsservicos, essa mesma "chamada" agora e uma requisicao HTTP ou gRPC que passa por rede, serializa dados, desserializa do outro lado e pode falhar por timeout, congestionamento ou indisponibilidade do servico de destino.
Uma operacao que antes era uma chamada de metodo agora envolve:
Servico A -> Serializacao -> Rede -> Load Balancer -> Rede -> Desserializacao -> Servico B
|
Servico A <- Desserializacao <- Rede <- Load Balancer <- Rede <- Serializacao <- Resposta
Multiplique isso por cada interacao entre servicos. Uma requisicao de usuario que tocava 3 modulos internos agora faz 3 chamadas de rede. Cada uma adicionando 1-10ms de latencia. Parece pouco? Em um fluxo que encadeia 7 servicos, voce adicionou 7-70ms de latencia pura de infraestrutura — sem contar o tempo de processamento.
No monolito, quando algo da errado, voce coloca um breakpoint, roda o debugger e caminha pelo codigo. Em microsservicos, quando algo da errado... voce precisa de:
E mesmo com tudo isso, debugar um problema que cruza 5 servicos continua sendo ordens de magnitude mais dificil do que debugar o mesmo fluxo em um monolito.
Um monolito: um build, um deploy, um rollback.
Microsservicos: N builds, N deploys, N rollbacks — e a pergunta que tira o sono: "Esses 5 servicos sao compativeis entre si nesta combinacao de versoes?"
Voce agora precisa de:
Em um monolito, metricas de aplicacao sao simples: tempo de resposta, uso de memoria, CPU, erros por endpoint.
Em microsservicos, voce precisa monitorar tudo isso POR servico, mais:
O custo de observabilidade em microsservicos e facilmente 5-10x maior que em um monolito.
Em um monolito com um banco de dados, voce tem transacoes ACID. Quer garantir que o pagamento foi registrado E o estoque foi atualizado? Uma transacao resolve.
Em microsservicos, cada servico (idealmente) tem seu proprio banco de dados. Agora a mesma operacao exige:
Vamos colocar em uma tabela o que voce GANHA vs o que voce PAGA:
| Dimensao | Monolito | Microsservicos |
|---|---|---|
| Chamadas internas | Nanosegundos (in-process) | Milissegundos (rede) |
| Debugging | Breakpoint local | Tracing distribuido |
| Deploy | 1 pipeline | N pipelines + compatibilidade |
| Observabilidade | Metricas simples | Stack completa de observabilidade |
| Consistencia | Transacao ACID | Sagas + consistencia eventual |
| Infra minima | 1 servidor / 1 container | Kubernetes + service mesh + message broker |
| Time minimo efetivo | 1-3 devs | 20-50+ devs (para ser eficiente) |
| Custo mensal infra (estimativa) | $50-500 | $2.000-20.000+ |
Olhe para essa tabela e me diga: uma startup com 5 desenvolvedores, 500 usuarios e receita de R$20k/mes deveria estar no lado direito?
O argumento mais comum a favor de microsservicos em startups e: "A Netflix usa. A Amazon usa. A Shopify usa."
Correto. Usam. Mas vamos entender POR QUE usam.
A Netflix migrou para microsservicos a partir de 2009, depois de uma falha catastrofica de banco de dados que derrubou o servico por 3 dias. Na epoca, a Netflix ja tinha milhoes de assinantes e centenas de engenheiros.
O problema deles era real: um unico ponto de falha em um monolito que atendia milhoes de requisicoes por segundo. A solucao foi decompor o sistema para que falhas fossem isoladas.
O contexto da Netflix:
O contexto da sua startup:
Percebe a diferenca?
A famosa decisao da Amazon de migrar para microsservicos — frequentemente citada como o "two-pizza team mandate" — aconteceu em 2002, quando a Amazon ja era uma das maiores empresas de e-commerce do mundo, com milhares de engenheiros.
O problema era coordenacao. Times enormes pisando nos pes uns dos outros em um monolito massivo. A solucao foi dar a cada time autonomia total sobre seu servico.
Com 6 pessoas no time, voce nao tem problema de coordenacao entre times. Voce tem um time. Que cabe em uma pizza, nao duas.
Aqui fica interessante. A Shopify, uma das maiores plataformas de e-commerce do mundo, NAO usa microsservicos da forma classica. Eles usam um monolito modular. O core da Shopify e uma aplicacao Ruby on Rails monolitica — mas com limites de modulo extremamente bem definidos usando o conceito de componentes.
A Shopify provou que e possivel escalar para bilhoes de dolares em transacoes com um monolito. Eles investiram em modularizacao, nao em distribuicao.
Essas empresas nao escolheram microsservicos porque e "moderno". Escolheram porque tinham problemas especificos que microsservicos resolvem:
Se voce nao tem esses problemas, microsservicos nao sao a solucao. Sao uma solucao procurando um problema.
Existe um conceito que deveria ser o default de toda startup, mas que raramente aparece em conferencias ou blog posts hypados: o monolito modular.
A ideia e simples: voce mantem uma unica unidade de deployment (monolito), mas organiza o codigo internamente com limites claros entre modulos, como se fossem servicos separados — so que sem a complexidade de rede.
Imagine um sistema de e-commerce. Em vez de criar microsservicos separados, voce cria modulos:
meu-ecommerce/
|-- src/
| |-- modules/
| | |-- catalog/
| | | |-- domain/
| | | |-- application/
| | | |-- infrastructure/
| | | |-- api/
| | |-- orders/
| | | |-- domain/
| | | |-- application/
| | | |-- infrastructure/
| | | |-- api/
| | |-- payments/
| | | |-- domain/
| | | |-- application/
| | | |-- infrastructure/
| | | |-- api/
| | |-- notifications/
| | | |-- domain/
| | | |-- application/
| | | |-- infrastructure/
| | | |-- api/
| |-- shared/
| | |-- kernel/
| | |-- infrastructure/
Cada modulo:
A comunicacao entre modulos acontece assim:
# ERRADO: Modulo de Orders acessando diretamente o repositorio de Catalog
class CreateOrderUseCase:
def execute(self, product_id: str, quantity: int):
product = catalog_repository.find_by_id(product_id) # Acoplamento direto!
# ...
# CERTO: Modulo de Orders usando a interface publica de Catalog
class CreateOrderUseCase:
def __init__(self, catalog_service: CatalogServiceInterface):
self.catalog = catalog_service
def execute(self, product_id: str, quantity: int):
product = self.catalog.get_product(product_id) # Via interface!
# ...
Essa separacao e crucial. Porque no dia em que voce REALMENTE precisar extrair um modulo para um microsservico, a interface ja existe. Voce so muda a implementacao de "chamada local" para "chamada de rede".
| Beneficio | Como funciona |
|---|---|
| Velocidade de desenvolvimento | Um build, um deploy, um debugger |
| Limites claros | Modulos se comunicam por interfaces, nao por acesso direto |
| Caminho para micro | Se precisar extrair um modulo, a interface ja existe |
| Transacoes simples | ACID funciona normalmente entre modulos |
| Time pequeno, grande impacto | Sem overhead de infraestrutura distribuida |
O monolito modular nao e um compromisso. E a arquitetura otima para a vasta maioria dos cenarios.
Chega de opiniao. Vamos criar um framework objetivo.
Microsservicos provavelmente fazem sentido quando voce atende pelo menos 3 destes criterios:
Dominio Maduro Dominio em Exploracao
+---------------------+------------------------+
Time Grande | MICROSSERVICOS | MONOLITO MODULAR |
(40+ engenheiros)| fazem sentido | ate o dominio estabilizar|
+---------------------+------------------------+
Time Pequeno | MONOLITO MODULAR | MONOLITO |
(<20 engenheiros)| com limites claros | simples e rapido |
+---------------------+------------------------+
Se voce esta no quadrante inferior direito — time pequeno, dominio em exploracao — e tenta fazer microsservicos, voce esta otimizando para o problema errado. Voce deveria estar otimizando para velocidade de aprendizado, nao para escala que nao tem.
Isso quase nunca aparece em conferencias. Ninguem sobe em um palco para dizer "a gente voltou para o monolito". Mas acontece mais do que voce imagina.
A Segment, plataforma de customer data, e talvez o caso mais documentado de migracao reversa. Eles tinham mais de 140 microsservicos para gerenciar integracao com diferentes destinos de dados. O resultado? Uma explosao de complexidade operacional que consumia o time.
A solucao? Consolidaram tudo em um unico servico chamado Centrifuge. Menos infra, menos bugs, mais velocidade.
O proprio Istio — um service mesh desenhado para gerenciar microsservicos — migrou de uma arquitetura de microsservicos para um monolito com o lancamento do Istiod. Os mantenedores perceberam que a complexidade operacional de gerenciar multiplos componentes separados (Pilot, Citadel, Galley, Mixer) estava dificultando a adocao e operacao do proprio produto.
A ironia nao poderia ser mais perfeita: a ferramenta criada para simplificar microsservicos descobriu que ela mesma funcionava melhor como monolito.
Em 2023, o time do Amazon Prime Video publicou um estudo de caso onde mostraram que ao mover uma ferramenta de monitoramento de qualidade de video de uma arquitetura de microsservicos com Step Functions para um monolito, eles reduziram custos em 90% e simplificaram significativamente a operacao.
Isso mesmo. A propria Amazon — poster child de microsservicos — publicou um caso onde monolito era a resposta.
O que esses casos tem em comum?
Ninguem foi demitido por voltar ao monolito. Pelo contrario — em todos esses casos, a migracao reversa MELHOROU velocidade, custo e confiabilidade.
"Ok, convencido. Mas como faco um monolito que nao vira uma bola de lama?"
Pergunta justa. Aqui esta o playbook.
Defina modulos com limites claros desde o dia 1. Cada modulo expoe uma interface publica e esconde sua implementacao.
# modules/payments/public_api.py
# Esta e a UNICA porta de entrada para o modulo de pagamentos
class PaymentService(Protocol):
def process_payment(self, order_id: str, amount: Decimal) -> PaymentResult: ...
def refund(self, payment_id: str) -> RefundResult: ...
def get_payment_status(self, payment_id: str) -> PaymentStatus: ...
# Tudo mais dentro de modules/payments/ e PRIVADO
# Nenhum outro modulo pode importar de modules/payments/internal/
Mesmo compartilhando o mesmo banco, separe logicamente:
-- Cada modulo tem seu schema ou prefixo
CREATE SCHEMA catalog;
CREATE SCHEMA orders;
CREATE SCHEMA payments;
-- Modulo de orders NAO faz query direta no schema de catalog
-- Usa a interface publica do modulo de catalog via codigo
Isso facilita uma futura separacao de banco se necessario.
Use um sistema de eventos interno (in-process) para comunicacao assincrona entre modulos:
# Quando um pagamento e confirmado, publica um evento interno
class PaymentConfirmedEvent:
payment_id: str
order_id: str
amount: Decimal
confirmed_at: datetime
# O modulo de notificacoes ESCUTA esse evento
# sem que o modulo de pagamentos precise saber que notificacoes existem
@event_handler(PaymentConfirmedEvent)
def send_payment_confirmation_email(event: PaymentConfirmedEvent):
# envia email
pass
Hoje e um evento in-process. Amanha, se precisar, voce joga esse evento para um RabbitMQ ou Kafka com mudanca minima.
# test_module_boundaries.py
# Este teste roda no CI e garante que nenhum modulo
# importa diretamente de outro modulo (exceto pela API publica)
import ast
import os
def test_no_cross_module_internal_imports():
"""Garante que modulos so acessam APIs publicas de outros modulos."""
violations = []
for module_dir in os.listdir('src/modules'):
for root, dirs, files in os.walk(f'src/modules/{module_dir}'):
for f in files:
if f.endswith('.py'):
filepath = os.path.join(root, f)
with open(filepath) as fh:
tree = ast.parse(fh.read())
for node in ast.walk(tree):
if isinstance(node, ast.ImportFrom):
if (node.module and
'modules.' in node.module and
module_dir not in node.module and
'.public_api' not in node.module):
violations.append(
f"{filepath}: importa {node.module}"
)
assert not violations, f"Violacoes de limite: {violations}"
Um monolito bem feito escala horizontalmente sem problemas:
Load Balancer
/ | \
Instancia 1 Instancia 2 Instancia 3
\ | /
Banco de Dados
(com read replicas)
Isso atende facilmente milhoes de requisicoes por dia. Quando ate ISSO nao for suficiente — e estamos falando de um problema bom de ter — ai voce considera extrair os modulos mais exigentes.
Um erro comum e tratar DDD como algo que so faz sentido com microsservicos. Como se voce precisasse de servicos separados para ter Bounded Contexts.
Errado.
Domain-Driven Design e sobre modelar o dominio do negocio de forma explicita no codigo. Isso funciona em qualquer arquitetura. Na verdade, DDD funciona MELHOR em um monolito modular, porque voce tem a simplicidade de um unico deployment com a clareza de dominios bem separados.
Cada modulo do seu monolito modular corresponde a um Bounded Context do DDD:
Bounded Context: Catalog
- Entities: Product, Category, Brand
- Value Objects: Price, SKU, Dimensions
- Language: "produto", "categoria", "vitrine"
Bounded Context: Orders
- Entities: Order, OrderItem, Shipment
- Value Objects: OrderTotal, ShippingAddress
- Language: "pedido", "item", "envio"
Bounded Context: Payments
- Entities: Payment, Invoice, Refund
- Value Objects: Amount, PaymentMethod
- Language: "pagamento", "fatura", "estorno"
Note que "Product" no contexto de Catalog e diferente de "Product" no contexto de Orders. No Catalog, Product tem descricao, fotos e especificacoes. Em Orders, Product e apenas um ID, nome e preco. Essa separacao de modelos e a essencia do DDD — e funciona perfeitamente em um monolito.
[Catalog] -----(produto publicado)----> [Orders]
[Orders] ------(pedido criado)--------> [Payments]
[Payments] ----(pagamento confirmado)-> [Notifications]
[Payments] ----(pagamento confirmado)-> [Orders]
Esse mapa existe no seu monolito modular. Os eventos internos que discutimos antes sao a implementacao desses relacionamentos. E se um dia voce precisar extrair Payments para um microsservico, o Context Map ja esta desenhado. Voce so muda o transporte de "in-process event" para "message broker".
DDD nao e pre-requisito para microsservicos. E pre-requisito para qualquer arquitetura que pretende durar.
A maioria das decisoes arquiteturais e avaliada no primeiro dia. "Microsservicos vao nos dar independencia de deploy!" Parece otimo no dia 1.
Mas o que acontece no dia 90? No dia 365?
Mes 1-2: Empolgacao. Setup de Kubernetes, CI/CD por servico, service discovery. Time sente que esta fazendo "engenharia de verdade".
Mes 3-4: Realidade bate. Primeiro bug cross-service que leva 3 dias para debugar (levaria 30 minutos em um monolito). Primeira inconsistencia de dados por consistencia eventual.
Mes 5-6: O time gasta 40-60% do tempo em infraestrutura e tooling, nao em features. O produto evolui devagar. Os fundadores perguntam por que o roadmap esta atrasado.
Mes 7-12: Ou o time resolve absorver a complexidade (e aceita ser mais lento), ou comeca a discutir "e se a gente simplificasse?". A migracao reversa e dolorosa.
Mes 1-2: Setup rapido. Um repositorio, um pipeline, um deploy. Time focado 90% em features.
Mes 3-4: Produto evolui rapido. Feedback do mercado chega rapido. Pivotar e simples — e tudo no mesmo lugar.
Mes 5-6: Dominio comeca a ficar claro. Voce ve quais modulos crescem, quais mudam pouco. Os limites entre modulos se refinam naturalmente.
Mes 7-12: Se o produto encontrou product-market fit e esta crescendo, voce agora tem clareza sobre QUAIS modulos precisam de tratamento especial. E pode extrair cirurgicamente, com contexto real, nao com palpites.
A diferenca nao e sutil. E brutal.
No cenario de microsservicos, voce tomou uma decisao irreversivel (cara para reverter) com informacao minima (dia 1). No cenario de monolito, voce adiou a decisao irreversivel para quando tem informacao maxima (depois de meses de operacao).
Isso tem um nome em engenharia: last responsible moment — tomar decisoes irreversiveis no ultimo momento responsavel, quando voce tem a maior quantidade de informacao possivel.
Vamos sair da teoria e entrar na pratica. Aqui esta um passo a passo para iniciar um projeto novo com a abordagem monolito-first.
Escolha um framework que suporte modularizacao
Defina a estrutura de modulos inicial (vai mudar, e OK)
Estabeleca regras de comunicacao entre modulos:
Configure CI com verificacao de limites (como o teste de imports que mostrei)
A cada trimestre, avalie:
[ ] Algum modulo tem requisitos de escala drasticamente diferentes?
[ ] O time cresceu a ponto de pisar nos pes uns dos outros?
[ ] Algum modulo precisa de ciclo de deploy independente?
[ ] Temos budget e time para operar microsservicos?
[ ] O dominio desse modulo esta maduro e estavel?
Se a resposta for "sim" para 3 ou mais perguntas para um modulo especifico, ESSE modulo e candidato a extracao. Nao o sistema inteiro. Um modulo. Com calma. Com dados.
Quando for hora de extrair um modulo:
A beleza dessa abordagem: voce extrai com base em DADOS, nao em palpites. Voce sabe exatamente qual modulo precisa, por que precisa e qual e o risco.
Seria desonesto nao reconhecer: existem cenarios onde microsservicos sao, sim, a melhor escolha desde o inicio.
1. Voce esta construindo uma plataforma onde terceiros deployam codigo Se voce e um PaaS ou FaaS (como Heroku, Vercel, AWS Lambda), microsservicos (ou algo similar) sao a natureza do seu produto.
2. Requisitos regulatorios exigem isolamento fisico Em financas e saude, regulacao pode exigir que certos dados estejam fisicamente isolados em servicos separados com controles de acesso independentes.
3. Voce tem times distribuidos globalmente com autonomia total Se voce tem um time em Sao Paulo cuidando de pagamentos e outro em Berlim cuidando de catalog, e eles precisam deployar independentemente em fusos diferentes, microsservicos podem ser a resposta pragmatica.
4. Partes do sistema tem linguagens/runtimes drasticamente diferentes Se o modulo de ML precisa rodar em Python com GPUs e o restante e Go, a separacao fisica faz sentido.
Em todos esses casos, note que a decisao e baseada em restricoes concretas, nao em preferencia estetica ou desejo de ter um curriculo mais impressionante.
Voce nao tem um problema de arquitetura. Voce tem um problema de product-market fit disfarçado de decisao tecnica.
Nos primeiros anos de uma startup, sua vantagem competitiva e velocidade. Velocidade de aprender, velocidade de iterar, velocidade de pivotar. Cada camada de complexidade arquitetural que voce adiciona e um imposto sobre essa velocidade.
Microsservicos sao uma ferramenta poderosa. No contexto certo. Com o time certo. No momento certo. Para 90% das startups, esse momento nao e o dia 1.
Comece com um monolito modular. Respeite os limites entre modulos. Use DDD para modelar seu dominio. E quando — SE — a dor de escala aparecer, voce tera toda a informacao necessaria para tomar a decisao certa.
O melhor microsservico e aquele que voce nao precisou criar.
ANTES DE ESCOLHER MICROSSERVICOS, RESPONDA:
==========================================
[ ] Nosso time tem mais de 40 engenheiros?
[ ] Temos budget dedicado para infraestrutura distribuida?
[ ] Nosso dominio e maduro e os limites sao claros?
[ ] Temos requisitos de escala que um monolito NAO atende?
[ ] Temos SLA de 99.99%+ que exige isolamento de falha?
[ ] Temos experiencia operando sistemas distribuidos?
Se menos de 3 "sim": FIQUE NO MONOLITO MODULAR.
CHECKLIST DO MONOLITO MODULAR:
==============================
[ ] Modulos com interfaces publicas bem definidas
[ ] Sem acesso direto entre bancos de modulos diferentes
[ ] Eventos internos para comunicacao assincrona
[ ] Testes automatizados verificando limites de modulo
[ ] Schema/tabelas separadas logicamente por modulo
[ ] Code review focado em acoplamento entre modulos
[ ] Avaliacao trimestral de necessidade de extracao
SINAIS DE QUE E HORA DE EXTRAIR UM MODULO:
===========================================
[ ] O modulo tem escala 10x+ diferente dos demais
[ ] O modulo precisa de deploy independente urgente
[ ] O time do modulo esta bloqueado pelo deploy do monolito
[ ] O modulo tem requisitos de runtime diferentes (ex: GPU)
[ ] Requisitos regulatorios exigem isolamento fisico
Comece simples. Escale com evidencia. E lembre-se: complexidade distribuida nao desaparece — ela muda de endereco.