Pular para o conteúdo

Retry, DLQ e reconciliação

Aula 3 de 88 minOperarAtualizada em 2026-10-04

Vídeo em produção

A gravação desta aula está no lote de produção. O objetivo, o exercício e a documentação já valem. Duração-alvo: 8 min.

Objetivo: Tratar item na DLQ

Selo de estado: Preview (teto atual do produto) · Curso ACD-230 — Operação: orquestração, falhas e recuperação · Aula 3 de 8 · Atualizado em 2026-10-04.

Objetivo#

Ao final desta aula você vai identificar um item parado na DLQ, corrigir a causa e reprocessá-lo de forma auditada, sem reprocessar cegamente o que vai voltar para lá.

Vídeo#

Identificador no manifesto: acd-230-03-retry-backoff-dlq · duração-alvo 8 min · tela do produto: /dags.

Roteiro (6 capítulos):

#Minutagem-alvoCapítuloRota do produto
10:00–0:50Duas classes de falha: retryable (transiente) e poison (configuração/validação). Só a primeira ganha nova tentativa./dags
20:50–2:40Retry com backoff: os marcadores [tentativa N] e [apos <ISO>] no erro da execução; base 5 min, teto 1 h, jitter determinístico./dags/[id]
32:40–4:20Tetos por tipo (dashboard 2 · report 3 · pipeline 2) e o que acontece ao estourar: status parada (DLQ)./dags
44:20–6:00A DLQ na prática: o item sai de todos os filtros executáveis e só volta pela mão de uma pessoa, com auditoria. Ler o motivo, corrigir a causa, reprocessar./dags/[id]
56:00–7:10Reconciliação de camadas: o relatório que aponta o buraco Bronze→Silver→Gold depois de uma interrupção — diagnóstico, não correção automática./sources/[id]
67:10–8:00Os três erros do curso e o "faça você mesmo"./dags

Conteúdo#

A DLQ é para

execuções, não para linhas de dado Um item em DLQ é uma execução (job) que falhou o suficiente para sair da fila. Linhas de dado reprovadas na qualidade são outra coisa — ver qualidade, deduplicação e rejeitados. E o reprocessamento a partir da DLQ é sempre uma intervenção manual de operador, com auditoria: nunca automática.

O conceito: nem toda falha merece uma nova tentativa

O produto classifica a falha antes de decidir o que fazer com ela:

ClasseExemplosO que acontece
retryable (transiente ou desconhecida)timeout, 5xx, erro de redere-tenta com backoff até o teto
poison (configuração/validação — retry não conserta)not found, syntax error, unrecognized name, invalid_grant, access denied, sem saldo de créditosvai direto para a DLQ, sem queimar tentativas

Note a assimetria deliberada: o desconhecido fica retryable (o teto protege), mas a falha que claramente não se resolve repetindo vai para a DLQ na primeira. Repetir uma credencial expirada dez vezes não renova a credencial — só consome recurso e atrasa o diagnóstico.

Retry com backoff (o que você vê na tela)

O estado da repetição aparece em marcadores no próprio erro da execução:

código
[tentativa 2] [apos 2026-09-08T13:40:00Z] connection reset by peer

[tentativa N] diz quantas vezes já re-tentou; [apos <ISO>] é um "não execute antes de" — é assim que o backoff é implementado. O cálculo é exponencial, base × 2^(n-1), com base de 5 minutos (um tique do cron), teto de 1 hora e jitter determinístico de até 25%. Determinístico de propósito: o mesmo cenário produz o mesmo atraso, e a produção não depende de sorteio.

Os tetos de tentativa diferem por tipo: dashboard 2, relatório 3, pipeline 2. Estourado o teto, o run vira DLQ — status cujo rótulo na tela é parada (DLQ), com a descrição "Falhou o número máximo de vezes e saiu da fila — precisa de operador."

As telas e os botões reais

Em /dags, um pipeline com item parado aparece sob Falha na última execução, e o estado da execução é parada (DLQ) — visualmente distinto de uma falha comum. Abra a execução (/dags/[id]), desça até a tarefa e a tentativa (aula 2) e leia o motivo: a mensagem já vem redigida, com segredos removidos. Em /sources/[id], o painel de ingestão mostra o histórico daquela fonte e é de lá que você dispara um novo processamento depois de corrigir. O ciclo correto é sempre o mesmo: ler o motivo → corrigir a causa na origem → reprocessar. Reprocessar antes de corrigir devolve o item à DLQ.

Reconciliação: o relatório do buraco

Uma interrupção no meio da execução pode deixar Bronze carregada sem Silver, ou Gold anterior à Silver. O produto compara os três rastros — execução do pipeline, tabelas Bronze e transformações — e produz um relatório acionável, escopado por workspace. Ele diagnostica; a correção é do operador. Não existe correção automática hoje, e isso é uma escolha: corrigir sozinho exigiria adivinhar qual camada é a verdade.

Exemplo: a Comércio Aurora

Na quarta-feira, a execução das 06:00 falha com [tentativa 1] [apos 2026-09-08T13:35:00Z] ETIMEDOUT. É retryable: o despachante re-executa cerca de cinco minutos depois, sozinho, e passa. Ninguém precisa fazer nada — e reexecutar manualmente nesse momento só atropelaria o backoff.

Na quinta, o token do conector de vendas expira e a execução falha com invalid_grant: token expired. Isso é poison: vai direto para a DLQ, sem consumir as duas tentativas do pipeline. João vê o estado parada (DLQ) em /dags, lê o motivo na tentativa, vai à conexão e substitui a credencial — a correção é na conexão, uma vez, e vale para todos os pipelines que a referenciam. Só então ele reprocessa a partir da DLQ, pelo painel de ingestão da fonte. O evento fica na auditoria com o nome de quem reprocessou.

Erros comuns

SintomaCausa provávelPróxima ação
Volta sempre para a DLQCausa permanente não corrigidaCorrija a origem (permissão, SQL, crédito, credencial) antes de reprocessar
"Nunca re-tenta"Erro classificado como poisonÉ o comportamento esperado: poison vai direto à DLQ
Run "preso" em execuçãoProcesso morreu no meioO recuperador de runs presos ("reaper") trata; a reconciliação aponta o buraco
Reexecutei e duplicou linhasReprocessamento com escopo maior que o necessárioEscolha o escopo mínimo e leia a prévia (aula 4)
Confundi pausar com executarPausar a agenda não esvazia a DLQ nem cancela o que está rodandoPausar só impede novos agendamentos
Log não bate com o erroMarcador [tentativa N] de uma tentativa, mensagem de outraLeia o log da tentativa cujo cabeçalho a tela cita (aula 2)

Estado do produto

As regras de retry, backoff, DLQ e reconciliação são determinísticas e provadas por teste — a capacidade C01.4 é o motor assíncrono idempotente. O teto segue Preview: a execução real em fila de nuvem é NÃO MEDIDO, não há SLA e o custo faturado em BRL também é NÃO MEDIDO. O que isso significa na prática: a decisão de re-tentar ou isolar é previsível e você pode confiar nela; o tempo que a fila leva para processar, não. O retry com backoff reduz o custo da reexecução cega, e o jitter evita martelar a origem.

Faça você mesmo#

No workspace de treino Aurora Varejo (abra /dags no console), como dono. Meta: reprocessar um item da DLQ.

  1. Provoque uma falha poison controlada: numa conexão de treino, deixe a credencial inválida (ou aponte para uma tabela que não existe) e execute o pipeline com Executar agora.
  2. Em /dags, confirme que o pipeline aparece sob Falha na última execução e que o estado da execução é parada (DLQ) — e não uma falha em repetição.
  3. Abra a execução, desça até a tarefa e a tentativa, e leia o motivo. Confirme que a mensagem não traz nenhum segredo.
  4. Confira se existe marcador [tentativa N]: numa falha poison não deve haver sequência de repetições, porque ela não queima tentativas.
  5. Corrija a causa — substitua a credencial na conexão, ou corrija a tabela de origem. A correção é na conexão, não dentro do pipeline.
  6. Reprocesse a partir do painel de ingestão em /sources/[id] e acompanhe a nova execução em /dags.
  7. Confira na auditoria que o reprocessamento ficou registrado com autor e horário.
  8. Confira o destino (contagem de linhas), não só o selo verde.

Você terminou quando o item tiver saído de parada (DLQ) por uma ação sua depois da correção, o reprocessamento estiver na auditoria e você conseguir explicar por que esse erro não ganhou nenhuma tentativa automática.

Checagem rápida#

Três perguntas no final da aula, corrigidas no servidor. A aula só conta como concluída depois da checagem.

Documentação relacionada#

Capacidades ensinadas#

C01.4 — o selo exibido na aula é sempre o estado mais conservador entre as capacidades citadas; nada aqui é "GA".

Carregando seu progresso…