Pular para o conteúdo principal

Conceitointermediário

Dead-Letter Queues

Visão Geral

Uma dead-letter queue recebe as mensagens que não puderam ser processadas após as tentativas configuradas.

Ela existe para dar à mensagem envenenada um caminho de saída da fila principal, sem descartá-la.

E ela só cumpre a função se alguém olhar. Uma dead-letter sem alerta e sem dono é um cemitério que dá a impressão de tratamento.

Problema

Sem dead-letter, uma mensagem que sempre falha tem dois destinos ruins: repetir indefinidamente — bloqueando — ou ser descartada — perdendo.

A dead-letter dá o terceiro: sair da fila e ficar guardada para análise.

O problema que ela cria é organizacional: mensagens acumulam lá e ninguém percebe. Isso é comum e é pior do que parece, porque cada mensagem representa uma operação de negócio que não aconteceu — um pedido não faturado, uma cobrança não emitida, uma notificação não enviada.

Conceitos Centrais

O que precisa ir junto com a mensagem

Uma mensagem sozinha na dead-letter é difícil de diagnosticar. O contexto necessário:

O conteúdo original, sem alteração.

O erro — exceção, mensagem, rastro de pilha.

Quantas tentativas e quando.

De qual fila e qual consumidor veio.

O identificador de correlação, para ligar aos registros da operação original.

Sem os três últimos, a análise começa por reconstruir o que aconteceu — que é o trabalho que o contexto existe para evitar.

Vários brokers adicionam parte disso automaticamente em atributos da mensagem; vale verificar o que o seu adiciona e complementar o que falta.

Ela precisa de alerta e de dono

Alerta. Qualquer mensagem na dead-letter deveria notificar. Em sistemas de volume alto, um limiar; em sistemas de negócio, a primeira mensagem já merece atenção.

Dono. Alguém responde por analisá-las. Sem isso, o alerta vira ruído ignorado.

A pergunta que revela se o processo existe: quantas mensagens estão na dead-letter agora, e há quanto tempo? Se ninguém sabe responder, o mecanismo está configurado e não está funcionando.

Reprocessar exige idempotência

Depois de corrigir a causa, as mensagens da dead-letter são reenviadas para a fila principal.

Isso é reprocessamento — e algumas delas podem ter sido parcialmente processadas antes de falhar. Se o consumidor gravou algo e falhou depois, reprocessar duplica.

Ver idempotência e mensagens duplicadas. Reprocessar sem elas troca um problema por outro.

Uma dead-letter por fila, não uma global

Uma dead-letter compartilhada entre vários consumidores dificulta o reprocessamento: é preciso saber para qual fila cada mensagem volta.

Uma por fila mantém a associação óbvia e permite políticas diferentes por consumidor.

Ela não é armazenamento de longo prazo

Mensagens ficam ali para serem analisadas e resolvidas, não guardadas. Um prazo de retenção evita acúmulo indefinido — e força o processo a existir, porque a mensagem some se ninguém agir.

O prazo precisa ser generoso o bastante para cobrir fim de semana e feriado.

Depois de analisar, há três destinos

Mensagem em dead-letter não é o fim do processo — é o começo de uma decisão que precisa ser tomada por alguém:

Descartar. A mensagem é inválida e não há o que fazer. Registre o descarte; uma dead-letter esvaziada sem registro apaga a evidência do problema.

Corrigir a mensagem e reprocessar. Um campo malformado na origem. Exige ferramenta de edição e trilha de auditoria de quem alterou o quê.

Corrigir o código e reprocessar. O caso mais comum. A mensagem estava certa e o consumidor tinha defeito.

O terceiro caso é o que justifica guardar a mensagem original intacta: depois da correção, o reprocessamento precisa dos dados como eles chegaram, não como o consumidor defeituoso os interpretou.

Sem esses três caminhos definidos e com dono, a dead-letter vira depósito.

Modelo Mental

A dead-letter é uma caixa de entrada, não um arquivo. Se ela nunca é esvaziada, o processo não existe.

Quando Usar

  • Todo consumidor de mensagem.
  • Especialmente onde a mensagem representa operação de negócio.
  • Onde a fila tem ordem — o bloqueio é mais grave.

Quando Não Usar

Sem alerta. Configurar a dead-letter e não monitorar dá falsa sensação de tratamento.

Como destino permanente. Mensagens precisam ser resolvidas.

Compartilhada entre consumidores diferentes. Dificulta o reprocessamento.

Sem retenção. Acumula indefinidamente.

Para falhas transitórias. Uma indisponibilidade de banco não deveria mandar mensagens para dead-letter — deveria haver retentativa com backoff. Se a dead-letter enche durante uma queda de dependência, a classificação de falha está errada.

Alternativas

  • Fila de reprocessamento com atraso — para falhas ambíguas, tentar de novo em horas em vez de desistir.
  • Descarte com registro — quando a mensagem é genuinamente descartável e o volume torna a análise inviável. Precisa ser decisão explícita.
  • Tabela de pendências — em vez de fila, gravar num banco com interface de análise. Melhor quando o tratamento envolve decisão humana.

A última é subestimada: para mensagens que exigem decisão de negócio, uma tela é melhor que uma fila.

Trade-offs

Com dead-letterSem
Fila não bloqueiaBloqueia ou perde
Mensagem preservada para análisePerdida
Mais uma fila a operar e monitorarMenos peças
Exige processo de tratamentoNada a fazer

Modos de Falha

Acúmulo silencioso. Sem alerta, ninguém percebe.

Sem contexto. A mensagem está lá e ninguém sabe por que falhou.

Reprocessamento duplicando. Sem idempotência.

Enchendo por falha transitória. Classificação errada manda mensagens que teriam sucesso.

Retenção expirando antes da análise. A mensagem some antes de alguém olhar.

Dead-letter da dead-letter. O reprocessamento falha de novo e volta — sem limite, é um laço mais lento.

Erros Comuns

Configurar e não alertar. A fila enche em silêncio e a descoberta acontece quando um cliente reclama de um pedido que sumiu, semanas depois.

Não incluir o erro junto com a mensagem. Sem a exceção, o carimbo de tempo e a tentativa em que falhou, quem investiga precisa reproduzir o problema para descobrir o que aconteceu — e frequentemente não consegue.

Não definir dono. Uma fila de mensagens mortas sem responsável nomeado não é esvaziada por ninguém; ela vira um cemitério que todos veem no painel e ninguém abre.

Reprocessar sem idempotência. A mensagem chegou ali porque falhou depois de ter efeito parcial. Reenviá-la sem proteção repete o efeito que deu certo e duplica cobrança, estoque ou notificação.

Não medir há quanto tempo as mensagens estão lá. A contagem não distingue cinco mensagens de hoje de cinco paradas há dois meses, e são situações completamente diferentes. A idade da mais antiga é a métrica útil.

Exemplo Real

Um sistema de assinaturas tinha dead-letter configurada em todas as sete filas — boa prática seguida corretamente.

Nenhuma tinha alerta.

Durante uma migração de esquema, o produtor passou a enviar um campo com tipo diferente. O consumidor de renovação de assinatura falhava na desserialização e mandava para dead-letter.

Isso durou 23 dias.

4 100 renovações não processadas. Assinaturas venceram sem cobrança, acessos foram suspensos, e clientes ligaram — o que finalmente levou alguém a investigar.

A descoberta veio de olhar a dead-letter e encontrar 4 100 mensagens, a mais antiga de três semanas.

O reprocessamento teve o próprio problema: algumas renovações tinham sido parcialmente processadas — a cobrança foi feita e a atualização da assinatura falhou. Reprocessar cobrou de novo 180 clientes.

As correções, em ordem de importância:

Alerta na primeira mensagem. Em sistema de negócio, uma mensagem na dead-letter é anomalia, não estatística.

Métrica de idade. Painel com quantidade e idade da mensagem mais antiga por fila.

Idempotência no consumidor de renovação, com chave por assinatura e período — o que teria evitado a cobrança dupla no reprocessamento.

Registro de esquema entre produtor e consumidor, impedindo que uma mudança incompatível seja publicada.

A lição registrada: a dead-letter fez exatamente o que devia — impediu o bloqueio da fila e preservou as mensagens. O que faltou foi a metade organizacional do mecanismo.

Conceitos Relacionados

Exercício Prático

Descubra, agora, quantas mensagens estão nas dead-letter queues do seu sistema e há quanto tempo.

Se você não consegue responder em um minuto, o mecanismo está configurado e não está sendo usado.

Perguntas de Entrevista

  • O que precisa acompanhar a mensagem na dead-letter?
  • Por que reprocessar exige idempotência?
  • Por que falhas transitórias não deveriam chegar à dead-letter?

Para Aprofundar

  • Hohpe, Gregor; Woolf, Bobby. Enterprise Integration Patterns, 2003.
  • Beyer, Betsy et al. Site Reliability Engineering. O'Reilly, 2016 — alertas acionáveis.
Terminou de ler este documento?Seu progresso fica salvo apenas neste navegador.