Marcio Cunha

Simulação de Condições de Rede Degradadas e Perda de Pacotes em Testes de Integração Contínua

Descubra como simular falhas de rede, latência alta e perda de pacotes em pipelines de CI para validar a resiliência de sistemas distribuídos antes do deploy em produção.

Marcio Cunha•2 min
Também disponível em:EnglishEspañol
Resumo
  • Ambientes de testes isolados frequentemente mascaram problemas reais de infraestrutura que aparecem somente sob estresse de rede.
  • Ferramentas de controle de tráfego a nível de kernel permitem injetar latência controlada e jitter sem alterar o código da aplicação.
  • Pipelines de integração contínua ganham maturidade quando validam timeouts e mecanismos de repetição automática de requisições.
  • O comportamento de sistemas assíncronos muda drasticamente quando pacotes TCP são descartados aleatoriamente durante o transporte.
  • Garantir resiliência contra falhas de conectividade evita interrupções catastróficas e melhora a experiência do usuário final.

O Desafio Silencioso da Conectividade Instável em Sistemas Modernos

Quando desenvolvemos software, costumamos assumir que a infraestrutura subjacente é perfeita. Na prática, pacotes de dados viajam por redes físicas complexas, roteadores sobrecarregados e conexões móveis oscilantes, onde a perda de pacotes e a latência alta são rotina. Testar aplicações apenas em redes locais perfeitas cria uma falsa sensação de segurança, pois o sistema desaba assim que encontra o mundo real.

A integração contínua (o processo automatizado de testar cada alteração de código antes de uni-la ao projeto principal) costuma rodar em servidores potentes com conexões ultrarrápidas. Para expor falhas ocultas de arquitetura, precisamos corromper artificialmente essa conexão durante os testes automatizados, simulando o caos do mundo real dentro do próprio pipeline.

Ferramentas de Injeção de Falhas de Rede em Containers

Para manipular o tráfego de rede sem alterar a lógica do software, recorremos a utilitários de sistema operacional que interceptam e modificam pacotes de dados. O mais famoso deles é o comando 'tc' (Traffic Control, um recurso do kernel do Linux para gerenciar o fluxo de tráfego), frequentemente combinado com o módulo 'netem' (Network Emulator), projetado especificamente para adicionar atrasos, corrupção, duplicação e perda de pacotes.

Em ambientes modernos baseados em containers (unidades isoladas que empacotam o código e suas dependências), podemos aplicar essas regras de rede diretamente na interface virtual do container antes de executar os testes de integração. Na prática, isso significa que podemos configurar o sistema para descartar aleatoriamente dez por cento de todos os pacotes enviados, forçando a aplicação a demonstrar se sabe lidar com respostas perdidas.

Implementando a Simulação de Perda de Pacotes com Docker e Netem

Para colocar a teoria em prática, podemos configurar um script de inicialização que utiliza o 'tc' para injetar degradação na rede do ambiente de teste. A seguir, veja como aplicar uma regra que adiciona cem milissegundos de atraso e descarta cinco por cento dos pacotes em uma interface de rede específica.

#!/bin/bash
# Identifica a interface de rede padrão do container
INTERFACE=$(ip route show | awk '/default/ {print $5}')

# Aplica atraso de 100ms com variação de 10ms e perda de 5% dos pacotes
sudo tc qdisc add dev $INTERFACE root netem delay 100ms 10ms loss 5%

echo