Refatoração de monólito global enterprise e aceleração de verificação
Herdei um monólito legado de anos atendendo marcas enterprise globais. A verificação de perfis e a geração de documentos levavam 10 minutos por requisição, travando servidores web e bloqueando registros com frequência.
Ruby on Rails • Java Spring Boot • Azure
O gargalo: uma requisição de dez minutos
O custo daquele desenho não eram os dez minutos em si — era o que esses dez minutos ocupavam. Cada verificação prendia uma thread de requisição por toda a sua duração, então um pico modesto de verificações simultâneas já bastava para esgotar os workers disponíveis e deixar o resto da aplicação na fila atrás de um trabalho que não tinha nada a ver com ela. Usuários que nunca tocaram na verificação viam a plataforma inteira ficar lenta.
O segundo custo era de correção. Os registros envolvidos em uma verificação ficavam bloqueados enquanto a geração rodava, então um processo que falhasse no meio deixava linhas presas e trabalho pela metade, sem forma segura de repetir — reexecutar arriscava emitir uma segunda via de um documento que já havia sido gerado.
A arquitetura: trabalho idempotente, fora do caminho da requisição
Desacoplei a geração síncrona em um pipeline de jobs assíncronos idempotentes. Conduzi uma transição faseada de 11 meses para serviços modernos mantendo a produção disponível sem interrupção.
Tirar a geração do caminho da requisição é a metade óbvia dessa frase. A metade que decide se funciona é a idempotência. Trabalho assíncrono é trabalho repetido — um job que falha, estoura o tempo ou é reentregue vai rodar de novo —, então cada unidade de trabalho precisava ser segura para executar duas vezes. Dar a cada job uma chave de idempotência para que uma repetição produzisse o mesmo resultado em vez de um segundo documento é o que tornou a entrega at-least-once aceitável, e o que transformou uma falha parcial de incidente em nova tentativa.
A migração em si era a restrição mais dura. A plataforma atendia marcas enterprise globais e não podia sair do ar para um cutover, então os serviços substitutos subiram ao lado do monólito e assumiram responsabilidades de forma incremental, um caminho por vez, com o código original mantido no lugar até que seu substituto estivesse provado sob tráfego real de produção.
O resultado
A verificação passou de 10 minutos para 50 segundos — uma redução de latência de 12x — e a camada web deixou de absorver o custo de um trabalho que nunca pertenceu ao caminho da requisição. O uptime da plataforma se manteve em 99,9% durante toda a transição, com zero interrupções de serviço.
O resultado duradouro é menos visível que o número de latência. Falhas de verificação passaram a ser repetíveis em vez de exigir recuperação manual, e publicar mudanças nesse caminho deixou de exigir janela de manutenção.
[NDA PROTECTED / ANONYMIZED]