Pular para o conteúdo

apps/patterns/retry-pattern

027 · Padrões Fundamentais · ≈ 6 min de estudo

Retry Pattern

Repete uma chamada que falhou por motivo transitório, com espera exponencial, teto e jitter, até um número máximo de tentativas. Erro de negócio nunca é repetido, e a mesma Idempotency-Key vai em todas as tentativas para que o reenvio não pague duas vezes. Use em chamada a PSP, adquirente ou antifraude sujeita a instabilidade curta.

passos
6
arquivos
7
testes
2
tecnologias
4
Lógica puraTypeScriptBunElysiaStryker
Baixar cartão

Cenário

Um banco digital envia PIX por um PSP externo. O PSP responde na primeira tentativa, depois devolve dois 503 seguidos, depois liquida mas responde tarde demais, depois recusa um valor acima do saldo e por fim fica fora do ar por mais tempo que o orçamento de tentativas. No fim, o PSP registra 3 liquidações para os 3 pagamentos que deram certo.

Planta

Sequência
8/8
gera a Idempotency-Key antes do loop1pixSend(R$ 500,00)2tentativa 1 (timeout de 500 ms)3liquida e demora a responder4TimeoutError é transitório: espera com backoff e jitter5tentativa 2, mesma Idempotency-Key6resultado da primeira liquidação (replayed)7PIX liquidado uma vez só8Cliente PIXretryWithPSP (processo Elysia)
8

8 passos — reproduza para seguir o fluxo

Como funciona

6 passos

Repete a chamada em falha transitória.

Esconde cada passo: lembre antes de tocar para revelar.

Vocabulário compartilhado

  1. 01

    Chave antes do looppixSend gera a Idempotency-Key uma vez; toda tentativa envia a mesma

  2. 02

    Classificação5xx, 429, 409 (mesma chave ainda em processamento), TimeoutError e falha de conexão são transitórios; os demais 4xx e erro desconhecido são permanentes e sobem na hora

  3. 03

    Backoff exponencialdelayBase × 2^(tentativa − 1), limitado ao delayMax

  4. 04

    Full jitterA espera é sorteada entre zero e o exponencial com teto, para as instâncias não retentarem juntas

  5. 05

    OrçamentoNo máximo attemptsMax tentativas, sem espera depois da última; o erro final é o da última tentativa

  6. 06

    Log por tentativaNúmero, motivo da falha e espera calculada

apps/patterns/retry-pattern

7 arquivos

src/

  • retry_pix.tsretryWith, classificação de erro transitório e cálculo do backoff com jitter
  • client_pix.tsCliente PIX: chave única por pagamento, timeout por tentativa e contrato da resposta
  • api_psp.tsPSP em processo Elysia próprio: replay por chave, 409 em andamento, 422 para payload diferente, falhas e resposta tardia sob comando
  • retry_pix.test.tstesteFronteira do orçamento de tentativas, classificação e atrasos com teto
  • client_pix.test.tstesteResposta perdida depois da liquidação não paga duas vezes; chave reutilizada com outro valor é recusada; recusa de negócio é repetida no replay
  • demo.tsdemoSobe o PSP e percorre os cinco cenários

./

  • stryker.config.jsoninfraMutação sobre src/retry_pix.ts

Executar · só Bun

  1. bun install# dependências
  2. bun run demo# roda o cenário

Testes: bun run test. Mutação: bun run test:mutation.

Requisitos
Bun
Esc

↑ ↓ navegarEnter abrir191 resultados