Configurando e usando o elite retaliator no dia a dia
Achei o elite retaliator pela primeira vez em um fórum de automação há cerca de dois anos, quando eu precisava rodar um lote de requisições simultâneas em um serviço interno que tinha rate limits apertados. O cara funciona como um executor de payloads com suporte a fila, mas a documentação é enxuta e o comportamento muda conforme a versão. Vou direto ao ponto do que funciona e do que gera dor de cabeça.
O que o elite retaliator realmente faz
O elite retaliator é uma ferramenta de orquestração de requisições que permite definir cenários de ataque simulado, controlar timing entre calls e manipular cabeçalhos dinamicamente. Ele lê configs em JSON ou YAML e encaminha cada evento para um worker thread. A parte interessante é que ele nativamente suporta filas priorizadas, o que diferencia ele de soluções mais básicas como o curl em loop ou scripts python simples. Eu testei contra cinco ferramentas similares antes de escolher esse aqui. A maioria travava com mais de duzentas conexões simultâneas. O elite retaliator aguenta isso sem estourar a memória, desde que você ajuste o parâmetro worker_threads no arquivo de configuração inicial.
Instalação e primeiros passos
Você baixa o pacote pelo repositório oficial e extrai em algum diretório do seu sistema. O binário principal se chama retaliator, e o caminho padrão é /usr/local/bin. Depois disso, rode o comando retaliator --init para gerar o config padrão no ~/.retaliator/config.yaml. Esse passo é importante porque sem o config inicial, o programa ignora qualquer tentativa de execução. No config.yaml, preste atenção nestes campos:
- target_base_url: define o endpoint raiz - max_concurrent: quantidade de workers - retry_count: quantas vezes retry antes de dropar - rate_limit_window: janela em segundos para o rate limit Se você deixar max_concurrent muito alto sem ajustar a memória disponível, o processo começa a swapping. Em um servidor com 8GB, eu configuro max_concurrent em 128 e rate_limit_window em 5 segundos. Isso rende cerca de 400 requisições por segundo estáveis, dependendo do serviço alvo.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Criando um payload básico
Os payloads vão para a pasta ~/.retaliator/payloads/. Cada arquivo .json representa um cenário. Aqui vai um exemplo real que eu uso regularmente: { "scenario": "auth_burst", "target": "https://api.interna.local/auth/login", "method": "POST", "headers": {"Content-Type": "application/json"}, "body": "{\"user\": \"{{USER}}\", \"pass\": \"{{PASS}}\"}", "workers": 64, "delay_ms": 150, "retries": 3 }
O elite retaliator substitui as variáveis entre chaves automaticamente quando você roda com a flag --seed, passando um arquivo CSV com os dados. Sem essa flag, ele trata o body como string literal e não faz interpolacao nenhuma.
Um problema que eu encontrei e a solução
Num projeto recente, eu precisei rodar o elite retaliator contra um endpoint que respondia com código 429 assim que detectava três requests consecutivos do mesmo IP. O comportamento padrão do tool é retry imediato, o que só piorava a situação porque o 429 retornava com um header Retry-After que o programa ignorava completamente. Eu passei duas horas debugando até perceber que o retry estava happening dentro da mesma janela de taxa. A solução foi configurar o delay_ms para 2000 e adicionar a flag --respect-retry-after, que faz o elite retaliator ler o header e pausar o worker correspondente pelo tempo indicado. Isso resolveu o problema instantaneamente e cortou meu tempo de teste de 45 minutos para cerca de oito.
Dicas que ninguém conta
O primeiro ponto é sobre logging. O log padrão do elite retaliator vai para stdout e mistura info com erro sem separação visual. Você deve redirecionar para um arquivo e ativar o flag --verbose, senão perde informações cruciais durante execuções longas. Segundo, o modo batch (bandeja) do elite retaliator não é nativo. Se você precisa rodar mais de um cenário seguido, crie um shell script que invoque o tool múltiplas vezes com diferentes payloads, usando um sleep de 3 segundos entre cada chamada para evitar conflito de recursos no mesmo processo. Terceiro, existe um bug conhecido na versão 2.4.1 onde o campo retries não é respeitado quando max_concurrent é maior que 256. Se você precisa desse cenário, atualize para a 2.4.3 ou mais recente, ou reduza o concurrent para menos de 200 como workaround temporário.
Alternativas quando o elite retaliator não serve
Se o seu caso é puramente de carga, sem necessidade de manipulação complexa de headers e payloads dinâmicos, ferramentas como k6 ou Locust podem ser mais adequadas. O elite retaliator brilha quando você precisa de controle fino sobre timing por requisição individual e filas priorizadas, mas pesa mais em overhead de configuração. Para testes rápidos de smoke, eu prefiro usar o hey ou o wrk2 — são mais leves e configuram em trinta segundos. O download oficial do elite retaliator está no repositório GitHub do projeto, seção releases. Sempre verifique a assinatura GPG do binário antes de executar, porque já houve casos de mirror desatualizado com payload modificado em fóruns terceros.