Pular para o conteúdo

apps/infrastructure/k6

179 · Infraestrutura em Docker · ≈ 6 min de estudo

k6 — teste de carga como portão de CI

k6 é uma ferramenta de teste de carga com script em JavaScript e thresholds: o teste passa ou falha por contrato, e o processo sai com código 99 quando um limite é rompido. É isso que o torna um portão de CI, não só um relatório. Use antes de um pico conhecido (fim de mês, Black Friday) e em todo merge que mexe no caminho quente.

passos
6
arquivos
7
testes
0
tecnologias
6
Infraestrutura realTypeScriptBunElysiaRedisk6Docker
Baixar cartão

Cenário

A API de transferências PIX precisa aguentar o pico de fim de mês. O saldo de cada conta vive no Redis em centavos inteiros, e débito e crédito acontecem num único script Lua: duas transferências concorrentes nunca passam as duas pela mesma checagem de saldo. O k6 sobe até 50 usuários virtuais e o contrato é p95 abaixo de 300 ms, menos de 1% de erro HTTP e menos de 50% de recusa por saldo. Depois da carga, a soma de todos os saldos tem que ser a mesma de antes.

Planta

Fluxo
14/14
demo: abre 6 contas no RedisAPI Elysia detransferências PIXgrafana/k6 em docker runrede do hostEstágio 1: rampaaté metade dos VUsEstágio 2: pico de VUsEstágio 3: rampa até zeroPOST /transfersScript Lua no Redisdébito e crédito atômicosSaldo cobre?201 com o novo saldo422 INSUFFICIENT_FUNDSmétrica insufficient_fundsThresholdsexit 0exit 99: CI reprovasimnãotodos okalgum rompido
14

14 passos — reproduza para seguir o fluxo

Como funciona

6 passos

Teste de carga na API de transferências PIX

Esconde cada passo: lembre antes de tocar para revelar.

Vocabulário compartilhado

  1. 01

    accountsOpen abre as 6 contas com saldo conhecido: sem isso, a segunda rodada mediria um sistema já drenado

  2. 02

    O script Lua (transferApply) confere o saldo e move o dinheiro atomicamente; chave ausente é conta vazia

  3. 03

    k6Run roda a imagem oficial grafana/k6 na rede do host, com o script montado de ./k6 e o perfil por variável (PEAK_VUS, STAGE_SECONDS, P95_MS)

  4. 04

    O perfil sobe em rampa, segura o pico e desce: número fixo de VUs esconde justamente o que a rampa revela

  5. 05

    422 é resposta de negócio, não falha de transporte: entra em expectedStatuses e numa métrica própria (insufficient_funds)

  6. 06

    O veredito é o código de saída: 0 com todos os thresholds, 99 com qualquer um rompido; o demo confere também a soma dos saldos

Trade-offs

O que se ganha, o que se paga

Sem threshold Com threshold
O teste sempre “passa”; alguém precisa ler o número O teste falha sozinho quando o p95 degrada
Regressão de performance chega à produção O pipeline barra antes do merge
Latência sem invariante de negócio Soma dos saldos confere que a carga não criou nem perdeu dinheiro

apps/infrastructure/k6

7 arquivos

k6/

  • transfer-load.jsPerfil de carga em estágios, métrica de negócio e thresholds

src/

  • k6_run.tsRoda o k6 em container e devolve código de saída e resumo
  • ledger_redis.tsChaves, script Lua da transferência, abertura das contas e soma dos saldos
  • api_transfers.tsAPI Elysia: POST /transfers, saldo por conta e /health
  • config_k6.tsConfiguração validada do ambiente
  • demo.tsdemoAbre as contas, sobe a API, roda o k6 e confere o total

./

  • docker.shinfraSobe o Redis e espera o PING

Executar · com Docker

  1. ./docker.sh up# sobe Redis
  2. cp .env.example .env# variáveis de ambiente
  3. bun install# dependências
  4. bun run demo# roda o cenário
  5. bun run test# integração contra o serviço real
Requisitos
BunDocker
Sobe junto
Redis

Por que se relacionam

Teste rápido

Qual destes combina com k6?

Próximo projeto · Padrões FundamentaisAMQP Message Handler
Esc

↑ ↓ navegarEnter abrir191 resultados