Muitas Pessoas Ainda Se Espantam - Enem 2024: Muitas pessoas ainda se espantam com o fato de um passageiro
Enem 2024: Muitas pessoas ainda se espantam com o fato de um passageiro

O problema que ninguém consegue consertar: por que tudo dá errado na produção

Eu vi desenvolvedores com cinco anos de experiência chorando no Slack às 3h da manhã porque um serviço que funcionava perfeitamente no staging simplesmente parou de responder em produção. A maioria das pessoas não espera que isso aconteça. Muitas pessoas ainda se espantam ao descobrir que sistemas em produção têm um comportamento fundamentalmente diferente de qualquer ambiente controlado, e a diferença não é uma questão de configuração ou de versão de dependência.

Por que muitas pessoas ainda se espantam com a complexidade dos ambientes de produção

O que acontece é simples e doloroso. Quando você desenvolve algo localmente, seu ambiente é isolado. Você controla a rede, a memória disponível, o cache do banco de dados, a latência de qualquer chamada externa. Em produção, todas essas variáveis deixam de ser constantes e viram incógnitas. E a maioria dos desenvolvedores não desenha seus sistemas considerando que tudo isso vai flutuar ao mesmo tempo. Eu passei três semanas debugando um problema que parecia impossível. Um endpoint de autenticação retornava 500 intermitentemente, mas apenas para requisições que vinham de um serviço específico. No ambiente de teste, tudo perfeito. A resposta ia de volta para casa, o serviço X era ignorado. Na produção, o serviço X estava sendo descartado em cerca de 12% das requisições, e cada descarte gerava um reprocessamento que sobrecarregava um worker já saturado. O banco de dados não estava falhando. A aplicação não estava travando. O problema era uma combinação de retry exponencial mal configurado com timeout de conexão otimista demais.

👉 Clique no botão abaixo para saber mais sobre o assunto!

Eu descobri isso manualmente, olhando logs de trace distribuído, mapeando o caminho de cada requisição. Não existe ferramenta automática que te diga isso. Você tem que entender o fluxo, saber onde olhar, e ter paciência suficiente para acompanhar requests que atravessam oito serviços diferentes antes de morrer. O que a maioria das pessoas não compreende na prática é que o problema raramente está em um único ponto. Está na interação entre pontos que nunca foram testados juntos sob pressão real. Timeout no serviço A dispara um retry no serviço B, que aciona uma fila no serviço C, que por sua vez enche um buffer que estava dimensionado para metade do tráfego atual. Isso não aparece em nenhum teste unitário. Não aparece em nenhum teste de integração. Só aparece quando o sistema está sob carga sustentada por mais de vinte minutos, e aí o custo de descobrir já é alto demais.

A verdade difícil é que não existe forma confiável de replicar a produção em nenhum ambiente interno. Você pode aproximar com ferramentas de load testing, pode usar chaos engineering, pode criar ambientes mais próximos do real com Kubernetes e service mesh, mas a probabilidade de surpresas permanece alta porque os padrões de tráfego reais são inherentemente caóticos e imprevisíveis. Nenhuma simulação captura isso direito. O que funciona na prática é construir resiliência desde o início. Circuit breakers com thresholds ajustados para o cenário pior, não para o cenário médio. Timeouts que consideram o percentil 99 de latência, não a média. Filas com retry que têm backoff exponencial com jitter, nunca retry fixo. Monitores que alertam quando algo começa a se comportar de forma estranha, não quando já está completamente quebrado. E, o mais importante, ter clareza sobre o que você não sabe e desenhar fallbacks para o ignorado.

Se você está começando agora, o conselho que eu daria seria: pare de tentar prever todos os problemas e comece a projetar para falhar de forma graciosa. Um sistema que quebra devagar, com visibilidade e fallbacks, é infinitamente melhor do que um sistema que quebra de uma vez e deixa você no escuro. A maioria dos engenheiros seniores que eu conheço não resolve problemas mais rápido do que os outros. Eles simplesmente esperam que problemas aconteçam e já estão preparados quando acontecem.