Integração e API

Dead-Letter Queue (DLQ)

5 tentativas antes do redrive são um exemplo de política para uma Dead-Letter Queue, mas o valor precisa refletir o tempo de recuperação do consumidor. A DLQ é uma fila separada que recebe mensagens rejeitadas, expiradas ou excedidas em tentativas. Amazon SQS usa `maxReceiveCount`; RabbitMQ usa dead-letter exchange. A escolha preserva dados e protege o fluxo principal, porém exige observabilidade, retenção e reprocessamento sem quebrar ordem ou duplicar efeitos.


🔀 Tipos de Comunicação
MAX RETRIES
Redrive após número máximo de entregas
No modelo mais comum, o broker conta quantas vezes uma mensagem foi recebida ou devolvida sem conclusão. Quando o contador ultrapassa o limiar, a mensagem sai do fluxo principal e entra na DLQ. Amazon SQS configura isso em uma redrive policy com `deadLetterTargetArn` e `maxReceiveCount`. Um valor de 5, por exemplo, significa que o consumidor terá várias oportunidades antes da quarentena. O número não deve ser escolhido por hábito. Se a dependência costuma recuperar em 10 min e as retentativas ocorrem em segundos, cinco tentativas podem ser insuficientes. Se o erro é permanente, cem tentativas apenas aumentam custo e atraso. A política deve trabalhar com backoff, visibility timeout e classificação de falhas. A mensagem também precisa manter ID, timestamp, origem e motivo para que o diagnóstico não dependa apenas do payload.
DLX
Dead-letter exchange e roteamento por motivo
RabbitMQ utiliza dead-letter exchanges. Uma mensagem pode ser republicada para a exchange configurada quando é rejeitada com `requeue=false`, expira por TTL, ultrapassa limite de comprimento ou excede limite de entregas em estruturas compatíveis. A exchange aplica routing key e envia a uma ou mais filas de quarentena. Esse desenho permite separar erros de validação, indisponibilidade externa e expiração. A configuração pode ser feita por policy, preferível a argumentos rígidos quando a operação precisa mudar sem redeclarar filas. O cabeçalho de morte registra histórico conforme o broker. O consumidor da DLQ não deve simplesmente devolver tudo à origem. Primeiro classifica, corrige causa e decide redrive. Uma rota equivocada pode criar ciclo entre fila principal e DLQ. Métricas precisam distinguir novas mortes de reprocessamentos.
FAILURE DEST
Destino de falhas em serviços gerenciados
Serviços como Azure Service Bus, Google Pub/Sub e plataformas serverless oferecem dead-letter subqueue ou tópico de falhas. Mensagens podem ir para esse destino por contagem de entregas, expiração, filtro inválido, tamanho, sessão ou falha da função, conforme o produto. O consumidor precisa conhecer a semântica específica. Em Azure Service Bus, a dead-letter subqueue permanece vinculada à fila ou assinatura e não é limpa automaticamente apenas por existir. Em Google Pub/Sub, a política de dead lettering encaminha após tentativas aproximadas e exige permissões adequadas para o service agent. O nome DLQ não garante a mesma ordem, retenção ou contagem entre produtos. A integração deve registrar o motivo original e as propriedades do serviço antes de normalizar para um painel comum.
QUARANTINE
Tópico de quarentena em streaming
Em Apache Kafka e arquiteturas de streaming, a DLQ costuma ser implementada como tópico separado, como `telemetry.invalid.v1` ou `commands.dlq`. O consumidor captura exceção, produz um envelope com tópico de origem, partição, offset, chave, schema, erro e stack resumida, e então avança o offset original conforme a política. Esse avanço evita travar a partição, mas transfere a responsabilidade ao fluxo de quarentena. Se a ordem é crítica, retirar uma mensagem pode permitir que eventos posteriores sejam processados antes da correção. Em dados de sensor isso pode ser aceitável; em comandos sequenciais, talvez não. Retry topics temporizados podem preceder a DLQ. O envelope não deve incluir segredos ou dados pessoais desnecessários. O reprocessador precisa restaurar a chave e preservar idempotência.
✅ Vantagens Arquiteturais
Protege a fila principal contra mensagens venenosas
Uma mensagem malformada ou incompatível pode falhar em todos os consumidores. Sem DLQ, ela retorna indefinidamente, consome CPU, gera logs e impede progresso quando a ordem é rígida. A quarentena remove o item do caminho principal após um limite. O restante continua. Isso aumenta disponibilidade. A decisão tem custo semântico. Se a mensagem representava atualização obrigatória, processar as seguintes pode criar estado inconsistente. O sistema deve declarar se pode pular. Em telemetria, normalmente sim; em contabilidade, não sem reconciliação. A DLQ não corrige o payload. Ela compra tempo e preserva evidência. Um alerta precisa ser gerado na primeira ou na taxa relevante, não apenas quando o armazenamento enche.
Preserva dados e contexto para diagnóstico
Descartar uma mensagem após erro elimina a principal evidência. A DLQ mantém payload e metadados. O envelope ideal inclui `message_id`, correlation ID, versão do schema, origem, número de tentativas, primeiro e último erro, timestamps e versão do consumidor. Isso permite reproduzir. O conteúdo precisa respeitar privacidade. Tokens, senhas e códigos de acesso devem ser removidos ou criptografados. A retenção pode ser de 7, 14 ou 30 dias conforme risco e volume. Um payload de 100 KB vezes um milhão de mensagens ocupa cerca de 100 GB antes de overhead. Limites e limpeza são necessários. Preservar não significa manter indefinidamente.
Permite reprocessamento seletivo após correção
Depois de corrigir um bug, atualizar schema ou restaurar uma dependência, a equipe pode redrive apenas mensagens elegíveis. O processo deve ter filtros por motivo, período, versão e origem. Antes, executa dry run ou validação. A taxa de reenvio precisa respeitar a capacidade do consumidor. Devolver 500 mil mensagens de uma vez pode causar nova falha. O redrive usa throttling e observa. Cada mensagem mantém ID ou chave idempotente para não duplicar efeitos já realizados parcialmente. O resultado é auditado: reenviada, processada, falhou novamente ou descartada por decisão. Uma interface de “reprocessar tudo” sem confirmação é risco operacional.
Cria um indicador de qualidade das integrações
A profundidade da DLQ, a idade da mensagem mais antiga e a taxa de entrada por causa são métricas. Um aumento após deploy indica regressão. Mensagens de schema desconhecido revelam incompatibilidade. Timeouts revelam dependência. A equipe define SLO, por exemplo nenhuma mensagem crítica por mais de 15 min. O alerta deve considerar volume. Uma única telemetria inválida pode ser baixa prioridade; uma mensagem de acesso, alta. Dashboards precisam agrupar por erro normalizado, evitando uma série por texto completo. A DLQ não deve virar armazenamento ignorado. Se ninguém possui runbook e responsabilidade, ela apenas adia perda.
Desacopla política de retry da lógica de negócio
O broker pode controlar contagem, espera e encaminhamento, enquanto o consumidor decide se o erro é transitório ou permanente. Erro de validação pode ir direto à DLQ. Timeout pode passar por retentativas. Isso evita tratar tudo igual. O custo é coordenar duas camadas. Se o SDK já retenta três vezes e o broker entrega cinco, podem ocorrer até quinze chamadas externas. A política total precisa ser calculada. Circuit breaker pode abrir e fazer as tentativas falharem rápido; a mensagem não deve ser enviada à DLQ apenas porque o circuito ficou aberto por 30 s, se a retenção permite esperar. O desenho combina, não empilha cegamente.