Pular para o conteúdo

apps/resiliency/timeout-pattern

105 · Resiliência & Tolerância a Falhas · ≈ 6 min de estudo

Timeout Pattern

Põe um limite de tempo em cada chamada de rede e um orçamento total em cada requisição. Chamada que passa do limite é cancelada de verdade — a conexão é abortada e o serviço chamado para de trabalhar —, e o erro vira resposta explícita em vez de um worker preso. Numa cadeia de chamadas, cada etapa recebe o menor entre o próprio SLA e o que resta do orçamento.

passos
6
arquivos
5
testes
0
tecnologias
4
Lógica puraTypeScriptBunElysiaStryker
Baixar cartão

Cenário

O PIX passa pelo antifraude e pela liquidação no BACEN, com orçamento total de 1,2 s. Antifraude lento é cortado no SLA de 400 ms. Com o antifraude respondendo em 380 ms e o BACEN lento, o corte do BACEN não é o SLA dele (1 s), e sim os 820 ms que restam do orçamento. Nos dois casos o serviço chamado percebe o cancelamento e para, e o cliente recebe 504 dizendo qual etapa estourou.

Planta

Sequência
5/5
deadline = agora + 1200 msPOST /antifraud/score (limite 400 ms)1aprovado em 380 ms2restam 820 ms, menor que o SLA do BACENPOST /spi/settlements (limite 820 ms, x-request-deadline)3820 ms sem resposta, abortconexão cancelada, BACEN para o trabalho4504 bacen excedeu 820 ms5API PIX (orçamento 1,2 s)Antifraude (SLA 400 ms)BACEN (SLA 1 s)
5

5 passos — reproduza para seguir o fluxo

Como funciona

6 passos

Corta chamadas que passam do prazo.

Esconde cada passo: lembre antes de tocar para revelar.

  1. 01

    timeoutRun cria um AbortController, arma o timer e passa o signal até o fetch — o abort cancela a conexão real

  2. 02

    A chamada também corre contra uma promise que rejeita no abort: operação que ignora o signal para de ser esperada no limite

  3. 03

    O timer é limpo no finally: chamada rápida não deixa timer pendurado

  4. 04

    deadlineCreate fixa o prazo absoluto na entrada; hopLimit dá a cada etapa min(SLA, prazo − agora) e recusa a etapa se nada restou

  5. 05

    O prazo segue no cabeçalho x-request-deadline; o serviço seguinte recusa com 504 uma requisição já vencida

  6. 06

    Cada timeout sai em log com a operação e o limite

Trade-offs

O que se ganha, o que se paga

4 vantagenscada ganho tem um preço4 custos

Vantagens

  • Libera workers presos e troca espera silenciosa por erro explícito

  • Deadline propagado impede que etapas somem orçamentos próprios

  • Abort cancela o trabalho no serviço chamado

  • SLA por etapa segue a latência real de cada dependência

Custos

  • Rejeita chamada que terminaria alguns ms depois

  • Exige carregar o prazo entre serviços

  • Operação já efetivada no destino precisa de idempotência para ser retentada

  • Limite abaixo do p99 corta tráfego normal

apps/resiliency/timeout-pattern

5 arquivos

src/

  • timeout_run.tsTimeout por chamada com abort e limpeza do timer, deadline e limite por etapa
  • api_payment.tsEndpoint do PIX com orçamento, SLA por etapa e deadline propagado
  • services_payment.tsAntifraude e BACEN em ElysiaJS, com latência em runtime e cancelamento no abort
  • config_timeout.tsConfiguração validada do ambiente
  • demo.tsdemoPIX normal, antifraude lento e BACEN cortado pelo orçamento restante

Executar · só Bun

  1. bun install# dependências
  2. bun run demo# roda o cenário
  3. bun run test# testes unitários
  4. bun run test:mutation# mutação com Stryker
Requisitos
Bun

Por que se relacionam

Teste rápido

Qual é o próximo passo depois de Timeout Pattern?

Próximo projeto · Resiliência & Tolerância a FalhasFallback Pattern
Esc

↑ ↓ navegarEnter abrir191 resultados