Software · Arquitetura de Software

Parallel Run e Branch by Abstraction: Migrar Sistemas Críticos sem Medo

Estratégias avançadas de modernização de sistemas legados de missão crítica: implementando Branch by Abstraction no código e executando Parallel Run com verificação automatizada de divergências.

Diagrama conceitual ilustrando parallel run e branch by abstraction: migrar sistemas críticos sem medo
Neste artigo

Migrações no estilo Big Bang — onde o time desenvolve uma versão inteiramente nova em segredo durante dois anos e tenta virar a chave da noite para o dia — possuem histórico notório de desastres operacionais e perdas financeiras. Para modernizar cálculos fiscais, motores de tarifação ou sistemas de cobrança sem paralisar o negócio, a engenharia de software adota duas práticas combinadas: Branch by Abstraction no código-fonte e Parallel Run no tráfego de produção.

flowchart TD
  subgraph BranchByAbstraction["Branch by Abstraction no Código"]
    Chamador["Consumidor (Controller / Job)"]
    Abstracao["Interface Abstrata (ICalculadorTributario)"]
    ImplLegada["ImplementacaoLegada (Código Antigo)"]
    ImplNova["ImplementacaoNova (Código Reescrito)"]
    Comparador["Proxy Comparador / Feature Flag"]

    Chamador --> Abstracao
    Abstracao --> Comparador
    Comparador --> ImplLegada
    Comparador --> ImplNova
  end

  subgraph ParallelRun["Execução em Paralelo (Produção)"]
    Req["Requisição Real"] --> Comparador
    Comparador -- "1. Executa e responde ao usuário" --> ImplLegada
    Comparador -. "2. Executa em segundo plano (Shadow)" .-> ImplNova
    Comparador -- "3. Compara resultados e alerta divergências" --> Telemetria[("Log Analytics / Alertas")]
  end

Branch by Abstraction: Refatoração Sem Criar Branches Longos

Em vez de criar uma branch separada no Git que dura meses e diverge irremediavelmente do código principal, o desenvolvedor introduz uma abstração (interface) diretamente no tronco principal (trunk):

  1. Cria a interface sobre o componente legado que será substituído.
  2. Faz todos os pontos do sistema chamarem a interface em vez da classe concreta legada.
  3. Cria a nova implementação aderente à interface.
  4. Conecta um despachante dinâmico controlado por feature flag.

Parallel Run: Comparando Respostas com Tráfego Real

No Parallel Run (também chamado de Dark Launching ou Shadow Traffic), tanto a implementação antiga quanto a nova recebem a mesma entrada simultaneamente em produção:

  • O sistema entrega ao usuário final o retorno gerado pelo código legado (garantindo que o comportamento oficial não seja alterado durante o teste).
  • A nova implementação processa o mesmo payload em paralelo de forma assíncrona.
  • Um interceptor compara os dois retornos campo a campo. Qualquer discrepância em centavos ou formatos de dados dispara um alerta para investigação.

Somente quando a telemetria comprovar zero divergências ao longo de semanas de processamento contínuo em produção, a equipe altera a feature flag para oficializar a nova implementação e remove cirurgicamente o código legado da base.

Explorar este tema no Grafo de Conhecimento