As Camadas Ocultas do Legado: Quando o Problema Está Longe de Onde Quebra

Uma história real de investigação em sistemas críticos de mainframe e a lição de que o sintoma raramente indica a causa raiz.


Quem atua há anos na sustentação e evolução de sistemas complexos certamente já passou horas investigando uma falha que parecia acontecer em um módulo e descobriu que ela tinha começado muito antes, em uma cadeia invisível de dependências.

Houve uma época em que, praticamente todo início de mês, nossa equipe de operações precisava disparar manualmente a rotina de abertura de um sistema financeiro crítico. A rotina simplesmente parava de rodar porque ficava aguardando um arquivo de conciliação que nunca parecia chegar a tempo.

A primeira hipótese do time foi óbvia: “O processo batch que gera o arquivo deve ter falhado.”

Fomos checar os logs e o processo estava executando normalmente, sem erros de sistema.


O Rastreamento da Cadeia Oculta

Com o processo gerador aparentemente saudável, a investigação se desdobrou em camadas:

  1. A Máquina e o Servidor: Verificamos o uso de CPU, memória, disco e fila de processos do servidor intermediário. Todos os indicadores operavam em níveis seguros.
  2. A Camada de Rede e Comunicação: Investigamos a conectividade e os protocolos de transferência de arquivos entre o ambiente de mainframe e a aplicação receptora. Nenhuma perda de pacotes ou interrupção de rota foi registrada.
  3. O Processamento no Mainframe: Entramos no ambiente centralizado de mainframe para auditar o job de geração. O processamento rodava, os registros eram consolidados, o arquivo era gerado com integridade e enviado com sucesso para o destino.

E, mesmo assim, a aplicação de abertura quebrava por falta do arquivo.


O Mecanismo Revelado

Foi nesse ponto que decidimos analisar uma variável que ninguém havia considerado até então: o tempo real de processamento.

No início de cada mês civil, o volume de transações a serem consolidadas quadruplicava. Um processamento que habitualmente consumia 10 minutos passava a demandar cerca de 40 minutos sob carga pesada.

O detalhe oculto: o timeout da rotina consumidora estava cravado rigidamente em 10 minutos.

Ou seja: o mainframe processava corretamente e enviava o arquivo íntegro, mas quando o pacote chegava à ponta final, a aplicação receptora já havia abortado a espera e assumido estado de erro.

“A maior lição que você aprende ao trabalhar com sistemas de missão crítica é que o ponto onde o erro se manifesta na tela quase nunca é o lugar onde o problema realmente se originou.”


A Solução Arquitetural

A correção não envolveu reescrever toda a base de código, mas sim repensar o acoplamento temporal da cadeia:

  • Eliminação de Timeouts Rígidos Baseados em Premissas Estáticas: Substituição da espera síncrona por um mecanismo baseado em eventos e confirmação explícita de entrega (event-driven).
  • Desacoplamento de Rotinas Críticas: Abertura do sistema condicionada à verificação de integridade da carga de dados, e não a um relógio arbitrário que só funcionava em dias de baixo movimento.
  • Observabilidade de Ponta a Ponta: Instrumentação de métricas que medem o tempo de ciclo total de cada job, alertando proativamente a equipe quando um lote ultrapassa a média histórica de duração.

Entender a dinâmica oculta dos sistemas legados é o que transforma um desenvolvedor focado apenas em sintaxe em um engenheiro capaz de desenhar arquiteturas com resiliência de verdade.