10 de Julho de 2025
Timeout, retry e deadline sem deixar cada camada decidir sozinha
Timeout curto demais quebra fluxo bom. Retry cego duplica efeito. Deadline ignorado vira fila invisível. O problema quase nunca é a ferramenta; é deixar cada camada improvisar sua própria política.
Andrews Ribeiro
Founder & Engineer
3 min Intermediario Sistemas
O problema
Muita discussão sobre resiliência vira catálogo de knobs:
- timeout
- retry
- backoff
- breaker
- deadline
Só que, em bastante time, cada pedaço do sistema decide isso sozinho.
Resultado:
- client HTTP com
timeoutde 10s - SDK do provider com retry interno
- use case repetindo de novo
- worker sem deadline nenhum
No papel, parece proteção.
Na prática, vira um sistema que espera demais, repete demais e ninguém entende direito por quê.
Modelo mental
Vale separar três coisas:
timeout: quanto uma chamada individual pode esperarretry: quando vale tentar de novo depois de falhadeadline: quanto tempo o fluxo inteiro ainda pode gastar
Essa distinção importa porque timeout local não controla o fluxo inteiro.
Sem deadline, é fácil cada chamada “usar um pouquinho” até o request inteiro virar uma espera longa e boba.
Onde o desenho costuma quebrar
O desenho quebra quando o time empilha política sem perceber:
- request web já faz retry
- biblioteca também faz retry
- fila reenfileira depois
- operação não é idempotente
Agora uma única falha transitória pode virar:
- 3 tentativas locais
- 2 tentativas na biblioteca
- 5 reprocessamentos no worker
Não é resiliência.
É multiplicação de risco.
Exemplo simples
Imagine um fluxo de checkout que precisa:
- validar risco
- autorizar pagamento
- registrar pedido
Se o request inteiro tem orçamento de 2 segundos, não faz sentido cada integração agir como se tivesse 2 segundos próprios.
Uma leitura melhor é:
- deadline total do fluxo: 2s
- risco pode gastar até X
- pagamento pode gastar até Y
- se o orçamento restante ficar pequeno demais, o sistema para de insistir
Isso evita o clássico request que ainda está “tentando ser resiliente” quando o usuário já foi embora.
Retry não é obrigação moral
Retry faz sentido quando:
- a falha é transitória
- a operação é segura para repetir
- o custo de insistir ainda cabe no fluxo
Retry faz menos sentido quando:
- a falha é claramente permanente
- a operação não é idempotente
- a latência adicional destrói a experiência
- o fluxo já perdeu o tempo útil
Tem time que trata retry como reflexo automático.
Isso costuma esconder decisão ruim.
Onde essa política deveria morar
Normalmente, a política deveria ser definida perto da orquestração do fluxo ou em cliente compartilhado bem controlado.
Não espalhada em:
- helper isolado
- SDK com defaults esquecidos
- chamada aleatória no meio do use case
O sistema precisa ter uma ideia coerente de:
- quanto tempo ainda resta
- quais erros merecem nova tentativa
- onde a insistência para
Como um senior pensa
Quem tem mais julgamento costuma perguntar:
- qual é o orçamento real deste fluxo?
- se isso falhar, insistir melhora ou piora?
- em que camada o retry deve existir para não duplicar política?
- a operação aguenta repetição legítima?
Essa conversa é muito melhor do que “vamos aumentar timeout”.
Ângulo de entrevista
Esse tema aparece em backend, integração externa, incidentes e system design.
O entrevistador quer ver se você entende:
- que timeout local e deadline global não são a mesma coisa
- que retry sem idempotência pode piorar a falha
- que política espalhada torna o comportamento imprevisível
Resposta forte costuma soar assim:
“Eu trataria timeout, retry e deadline como política de fluxo. Definiria onde o retry realmente mora, propagaria o orçamento de tempo do request e só repetiria o que for transitório e seguro para executar de novo.”
Takeaway direto
Sistema resiliente não é o que tenta para sempre.
É o que insiste com critério e desiste no momento certo.
Resumo rápido
O que vale manter na cabeça
- Timeout não é só um número técnico; ele precisa respeitar o tempo total que o fluxo ainda pode gastar.
- Retry bom nasce de política central e de operação idempotente, não de repetição cega em qualquer camada.
- Deadline ajuda a impedir que cada chamada local consuma o orçamento inteiro do request.
- Quando cada camada decide sozinha, o sistema acumula espera invisível, duplicação e comportamento imprevisível.
Checklist de pratica
Use isto ao responder
- Consigo dizer qual é o orçamento total de tempo do fluxo?
- Se houver retry, sei exatamente em qual camada ele acontece?
- Minha operação é segura para repetir ou estou empurrando duplicação para frente?
- Consigo explicar quando o sistema deve insistir e quando deve desistir?
Você concluiu este artigo
Compartilhar esta página
Copie o link manualmente no campo abaixo.