Metodologia7 min

Tráfego Real vs Simulado: quando os números mentem

Testes de carga com tráfego sintético podem dar falsa confiança. Entenda as diferenças e como criar simulações mais realistas.

"Nosso teste de carga passou com 10.000 usuários". Ótimo. Mas seu teste simula o comportamento real de 10.000 pessoas diferentes, ou 10.000 robôs fazendo a mesma coisa? A diferença entre tráfego real e simulado pode ser a diferença entre sucesso e desastre em produção.

Um teste de carga só é tão bom quanto sua capacidade de simular a realidade.

A Ilusão do Tráfego Sintético

O problema

Teste típico:
  - 1000 virtual users
  - Todos fazem login
  - Todos buscam "produto X"
  - Todos adicionam ao carrinho
  - Todos fazem checkout

Realidade:
  - 70% apenas navegam
  - 20% buscam produtos diferentes
  - 8% adicionam ao carrinho
  - 2% fazem checkout
  - Cada um em velocidades diferentes

Por que isso importa

Teste sintético:
  - Cache hit rate: 99% (todos buscam "produto X")
  - DB connections: estáveis
  - Resultado: "Sistema aguenta 10K users"

Produção real:
  - Cache hit rate: 40% (buscas diversas)
  - DB connections: picos por queries variadas
  - Resultado: Sistema cai com 3K users

Diferenças Fundamentais

1. Distribuição de ações

Tráfego Real:
  ┌─────────────────────────────────┐
  │ Ação          │ % dos usuários │
  ├───────────────┼────────────────┤
  │ Home          │ 100%           │
  │ Browse        │ 80%            │
  │ Search        │ 45%            │
  │ Product View  │ 60%            │
  │ Add to Cart   │ 15%            │
  │ Checkout      │ 3%             │
  │ Payment       │ 2.5%           │
  └─────────────────────────────────┘

Teste Sintético Típico:
  - Todos passam por todos os passos
  - Funil artificial de 100%

2. Think time

Tráfego Real:
  - Usuário lê página: 30s-5min
  - Decide se compra: variável
  - Distrai, volta depois: comum

Teste Sintético:
  - Think time fixo: 5s
  - Sem variação
  - Comportamento robótico

3. Dados únicos

Tráfego Real:
  - Milhões de produtos diferentes
  - Milhares de termos de busca
  - Cada usuário tem histórico único

Teste Sintético:
  - 10 produtos de teste
  - 5 termos de busca
  - IDs sequenciais

4. Padrões temporais

Tráfego Real:
  - Ramp-up orgânico ao longo de horas
  - Picos em horários específicos
  - Variação por dia da semana

Teste Sintético:
  - Ramp-up de 60s para carga total
  - Carga constante
  - Sem variação temporal

Impacto no Sistema

Cache effectiveness

Real:
  GET /product/12345 → cache miss
  GET /product/67890 → cache miss
  GET /product/11111 → cache miss
  Cache hit rate: 30-40%

Sintético:
  GET /product/TEST1 → cache miss
  GET /product/TEST1 → cache hit
  GET /product/TEST1 → cache hit
  Cache hit rate: 95%

Resultado: DB sobrecarrega em produção

Connection patterns

Real:
  - Conexões persistentes variam
  - Sessões longas e curtas misturadas
  - Reconexões frequentes

Sintético:
  - Pool de conexões estáveis
  - Reuso máximo
  - Sem churn de conexões

Query diversity

Real:
  SELECT * FROM products WHERE name LIKE '%sapato%'
  SELECT * FROM products WHERE category = 'eletrônicos'
  SELECT * FROM products WHERE price < 100
  → Query plans variados, índices diferentes

Sintético:
  SELECT * FROM products WHERE id = 1
  SELECT * FROM products WHERE id = 1
  SELECT * FROM products WHERE id = 1
  → Mesmo query plan, cache do DB maximizado

Como Aproximar da Realidade

1. Analisar tráfego real primeiro

-- Distribuição de endpoints
SELECT
  endpoint,
  count(*) as hits,
  count(*) * 100.0 / sum(count(*)) over() as percentage
FROM access_logs
WHERE timestamp > now() - interval '7 days'
GROUP BY endpoint
ORDER BY hits DESC;

-- Termos de busca mais comuns
SELECT
  search_term,
  count(*) as frequency
FROM search_logs
WHERE timestamp > now() - interval '30 days'
GROUP BY search_term
ORDER BY frequency DESC
LIMIT 1000;

2. Modelar distribuições reais

// k6 com distribuição realista
export default function () {
  const action = randomWeighted({
    browse: 0.80,
    search: 0.45,
    view_product: 0.60,
    add_cart: 0.15,
    checkout: 0.03,
  });

  // Think time com distribuição log-normal
  // (mais realista que uniforme)
  sleep(randomLogNormal(30, 2));

  // Dados variados de pool realista
  const product = getRandomProduct(productPool);
  const searchTerm = getRandomSearchTerm(searchTerms);
}

3. Usar dados de produção (anonimizados)

Ideal:
  - Export de IDs de produtos reais
  - Termos de busca reais (sem PII)
  - Distribuição de categorias real

Processo:
  1. Query em produção para extrair dados
  2. Anonimizar/mascarar dados sensíveis
  3. Criar pool de dados para teste
  4. Usar pool com distribuição proporcional

4. Simular padrões temporais

// Simular ramp-up orgânico
export const options = {
  scenarios: {
    organic_ramp: {
      executor: 'ramping-arrival-rate',
      startRate: 10,
      timeUnit: '1m',
      preAllocatedVUs: 50,
      maxVUs: 500,
      stages: [
        { duration: '2h', target: 100 },  // Manhã
        { duration: '2h', target: 300 },  // Pico
        { duration: '2h', target: 200 },  // Tarde
        { duration: '2h', target: 400 },  // Pico noturno
        { duration: '2h', target: 50 },   // Madrugada
      ],
    },
  },
};

5. Incluir comportamentos edge-case

Não esqueça:
  - Usuários que abandonam no meio
  - Requisições duplicadas (double-click)
  - Timeouts e retries do cliente
  - Sessões que expiram
  - Browsers antigos/lentos
  - Mobile vs Desktop mix

Validando a Simulação

Comparar métricas

Métricas para validar:

Cache:
  Produção hit rate: 42%
  Teste hit rate: 85% ← Muito alto, ajustar

DB:
  Produção queries/s: 5000
  Teste queries/s: 1200 ← Muito baixo

Latency distribution:
  Produção p99/p50 ratio: 8x
  Teste p99/p50 ratio: 2x ← Muito uniforme

Checklist de realismo

## Validação de Cenário

### Dados
- [ ] Pool de produtos > 1000 itens?
- [ ] Termos de busca > 500 únicos?
- [ ] IDs de usuário não sequenciais?

### Comportamento
- [ ] Funil reflete conversão real?
- [ ] Think time é variável?
- [ ] Mix de ações reflete analytics?

### Temporal
- [ ] Ramp-up > 30 minutos?
- [ ] Variação de carga incluída?
- [ ] Duração mínima 1 hora?

### Edge cases
- [ ] Abandono incluído?
- [ ] Erros do cliente simulados?
- [ ] Mix de dispositivos?

Técnicas Avançadas

Traffic replay

Conceito:
  Capturar tráfego real de produção
  Reproduzir em ambiente de teste

Ferramentas:
  - GoReplay (goreplay)
  - TCPReplay
  - Custom log replay

Cuidados:
  - Anonimizar dados sensíveis
  - Ajustar timestamps
  - Escalar proporcionalmente

Shadow traffic

Conceito:
  Duplicar % do tráfego real para ambiente de teste
  Comparar comportamento em tempo real

Vantagem:
  Tráfego 100% real

Desvantagem:
  Requer infra duplicada
  Cuidado com side effects

Production testing (com cautela)

Técnicas:
  - Canary deployment
  - Feature flags
  - Traffic shifting gradual

Permite:
  Validar com tráfego real
  Em escala real
  Com rollback rápido

Conclusão

Tráfego sintético é necessário, mas precisa ser realista:

  1. Analise produção primeiro - entenda o comportamento real
  2. Modele distribuições - não use valores fixos
  3. Diversifique dados - evite cache artificial
  4. Simule padrões temporais - ramp-up orgânico
  5. Valide contra produção - compare métricas

O objetivo não é passar no teste. É prever o comportamento em produção.


Este artigo faz parte da série sobre a metodologia OCTOPUS de Performance Engineering.

OCTOPUSload testingtráfegosimulação
Compartilhar:
Read in English

Quer entender os limites da sua plataforma?

Entre em contato para uma avaliação de performance.

Fale Conosco