DLQ e tratamento de mensagens venenosas
O Dead Letter Queue (DLQ) é uma fila/top isolada para mensagens que não foram processadas por um consultor regular após um número específico de tentativas ou por razões técnicas/empresariais explícitas (esquema de má conduta, timing, conflito de versões etc.). Mensagem venenosa (poison mensagem) - Gravação cuja reaproveitação é concluída de forma estável por um erro e ameaça a estabilidade do pipline.
O objetivo do DLQ é salvar o SLO, localizar a falha, impedir o bloqueio do fluxo principal e garantir a capacidade de análise e reprodução segura (Redreiva).
1) De onde vêm as mensagens venenosas
Esquemas/contratos: alterações incompatíveis, campos obrigatórios ausentes, tipos errados.
Validações de negócios: duplicados, invariantes quebrados, eventos vencidos.
Ordem e causalidade: «Update» chegou a «Create», correlações omitidas, out-of-order.
Idempotidade: reaproveitamento gera efeitos secundários.
Dependências externas: limites/temporizações limitados, API inacessível.
Dados: corrupção de carga útil, codificação errada, excesso de tamanho.
2) Critérios de envio para DLQ
A mensagem entra no DLQ se uma ou mais condições forem cumpridas:- Excesso de maxAttempts de processamento do portador/worker.
- O erro foi classificado como defeituoso (não-retryable): esquema de inadimplência, falta de recurso crítico, proibição de negócios.
- A mensagem deadline (TTL/expedition) expirou.
- A política de circuito breaker ou admision control para esta chave/tenante foi executada.
- Solução expressa do operador (eject manual do fluxo principal).
3) Topologias e pattern DLQ
Per-queue DLQ: Cada fila/topic tem o seu DLQ. Simples e transparente.
Central DLQ: «parquinho» compartilhado para casos complexos, é fácil para ferramentas de análise unificadas.
DLT (Dead Letter Topic): Para os pneus orientados logs, um topic separado com metadados de causa de falha.
Quarantine: Tampão de quarentena com acesso rígido e saúde PII para análise manual.
Shadow-stream: Duplicar mensagens problemáticas para «sombra» para experiências seguras de fixação.
4) Metadados que são obrigados a acompanhar o DLQ
Conjunto mínimo:- Causa de falha: código/classe de erro, stack/trace id.
- Contexto de retrações: 'attempt',' maxAttempts ',' first _ seen _ ts', 'last _ attempt'.
- Correlação: 'trace _ id', 'span _ id', 'tenant _ id', 'entity _ id', chave de partilha.
- Original offset/partition/sequence (para pneus de laje) ou mensagem-id.
- Contrato/esquema/versão de carga útil.
- Idempotency-key/Request-id (se houver).
- Origem do roteiro: nome da fila/top, grupo de consoante.
5) Políticas de retrações para DLQ
Antes de enviar para o DLQ, use uma nova tentativa correta:- Breves retais de consoante: 'maxAttempts' 2-5, exponential backoff + jitter, caps em concurrency.
- Backpressure cooperativo: redução da concorrência quando os erros crescem.
- Classificação de erros: retryable ('5xx', timeout) vs não-retryable (validação, schema mismatch).
- Filas adiadas (delay queue): 5s → 30s → 2m para falhas temporárias.
- Isolamento per-key: Se «ruidar» uma chave específica, não bloqueie a partishene inteira.
6) Redrave seguro (reaproveitamento de DLQ)
Redrave é um retorno controlado de mensagens do DLQ para o processamento.
Princípios:1. Verificação de fix: redrave somente após a correção de código/configuração/esquema ou após a recuperação de dependências externas.
2. Idempotidade: Os processadores devem ser resistentes à repetição (upsert, efeito-tolurante).
3. Deduplicação por 'idempotency _ key '/' mensagem _ id '/' business _ key'.
4. Dosagem e janelas: batches por N mensagens, rate-limit por redrave, «janelas» por hora/partição.
5. Validação local: Verificação rápida do padrão antes da redrave (reject de maletas de névalidas iniciais).
6. Prioridade: Redrave não deve substituir o tráfego prolongado (baixa prioridade de workers/pool separado).
7. Observabilidade: métricas individuais e trailers para redrave; relatório de resultados (sucesso/novo DLQ/perda).
7) Semântica de entrega e ordem
At-least-once é o modo mais frequente, que requer idempotidade e dedução.
At-se-once - DLQ pode ser desativado; Risco de perda. Use apenas para perdas válidas.
Exactly-once (eficaz): é alcançado com transações e dedução no armazenamento empresarial; caro e específico.
Ordem: O DLQ normalmente rompe a ordem para uma chave/partição específica. Se a ordem for crítica, redesenha-se na chave e em sequência.
8) Esquemas, contratos e validação
Schema registry/contratos: versionização clara, evolução com backward/forward-compatibilidade.
Validação de entrada: Verificação de baixo custo através da JSON Schema/Protobuf/Avro antes dos passos difíceis.
Política de incompatibilidade: no campo de quebra, imediatamente no DLQ com o código 'SCHEMA _ INCOMPATÍVEL'.
Redaction PII: no DLQ, guarde apenas o necessário; campos sensíveis disfarçam.
9) Idempotidade e dedução
Idempotency-key: Forma em um projector de «sentido de negócio» (tenant + entity + operation + ts-bucket).
Revistas Dedups: Guarde as últimas chaves 'N' com TTL; Lembre-se do «efeito» da operação.
Upsert/merge: evite «insert-only» sem restrições.
Efeitos Side: para chamadas externas - Revise e verifique «repetição» antes da chamada.
10) Observabilidade e SLO
Métricas (turnos/tenante/chave):- DLQ rate (msg/s), proporção de mensagens, média/mediana «idade» no DLQ.
- Redwave (%), participação DLQ de novo.
- Classificação de razões: schema, validação, timeout, dependency, unknown.
- p95/p99 latência de processamento do fluxo principal vs em redrave.
- Tamanho do DLQ, risco de congestionamento.
- As marcas obrigatórias são: 'mensagem _ id', 'entity _ id', 'tenant _ id', 'attempt',' reason ',' redrive _ batch _ id '.
- Traçado do ramo DLQ: desde a origem até o novo sucesso.
- O percentual de mensagens processadas com sucesso ≥ X% por T minutos.
- Tempo de investigação e correção para a mala DLQ ≤ Y horas.
- A «idade» máxima da mensagem no DLQ ≤ Z horas (com alert).
11) Segurança e conformidade
Acesso com os menores privilégios: redrave - apenas para operadoras/playbooks.
Auditoria: quem e quando desencadeou a redrave/remoção/edição de metadados.
Saneamento: ao transferir para o DLQ central, remova os segredos PII/PI.
Retenção: prazos individuais de armazenamento e políticas de remoção para DLQ.
12) Multi-tenência
Tags 'tenant _ id/place': Distingue limites, prioridades de Redwave, relatórios.
DLQ para tenentes ou partituras, para que o cliente «barulhento» não faça um DLQ comum.
Billing/quotas: Leve em conta o volume de DLQ e o custo de redrave em usage.
13) Modelos de configuração (exemplo)
yaml consumer:
max_attempts: 4 backoff:
strategy: exponential_full_jitter initial_ms: 200 max_ms: 5000 classify_errors:
retryable: [TIMEOUT, DEP_UNAVAILABLE, 5xx]
nonretryable:[SCHEMA_INCOMPATIBLE, VALIDATION_FAILED, DUPLICATE]
concurrency_caps:
per_partition: 8 per_tenant: 50
dlq:
type: topic name: myapp. events. dlq metadata:
include: [reason, stack, attempt, first_seen_ts, last_attempt_ts, schema_version,
tenant_id, entity_id, trace_id, source_topic, partition, offset]
retention_hours: 168 pii_redaction: true
redrive:
mode: batch batch_size: 500 rate_limit_per_sec: 50 priority: low validate_schema_before_redrive: true idempotency:
dedup_ttl_hours: 24 ordering:
by_key: true
14) Playbooks operacionais (runbooks)
1. Crescimento anormal do DLQ - incluir throttling prod consumer, analisar causas top, verificar lançamentos/circuitos.
2. Schema mismatch: retrocesso/fixação do esquema, migração do adaptador, redrive após a verificação.
3. Dependência externa não disponível: paragem de retrações, ativar a fila delay, redrive após a recuperação.
4. DLQ de novo após a Redwave: ative o processador/simulador «shadow», verifique a idempotação, estreite o batch.
5. Download DLQ: evacuação de arquivo-armazenamento, ativação de redrave seletivo por chaves/razões.
15) Testes e caos
Injecção de erros: schema-break, validação, temporizações, 1-na-N erros pegajosos.
Redrave em massa: verificação da dosagem e do impacto na proda.
Out-of-order seqüência: ensure processamento correto por chave.
Corrupção de carga útil - validação e rejeição segura.
Recuperação da queda do redrave worker: Idempotidade das operações batch.
16) Erros típicos
A falta de metadados no DLQ → não é possível clusterizar causas e redesenhar com segurança.
Redrave em massa sem limites → novamente degradação de produção.
Não há idempotidade/dedução → duplos e efeitos colaterais.
Misturar PII em DLQ central sem saneamento.
A ausência de esquemas/contratos → «surpresas» na evolução das mensagens.
O único DLQ compartilhado sem particionamento por tenentes/chaves.
Retraias infinitas em vez de DLQ precoce para erros não-retryable.
17) Receitas rápidas
Fluxo de negócios normal: 3-4 tentativas, backoff exponencial com jitter, classificação inicial de erros, DLQ com metadados completos.
Eventos críticos (pagamento): Idempotação rigorosa, tempo curto, mínimo de tentativas, DLQ rápido e análise manual.
Redrave em massa após fix: small batches (100-500), rate-limit, pool de workers separado, monitoramento de sucesso> 95% antes de aumentar a velocidade.
Multi-Tenente, limites para-tenentes para redrave, relatório sobre os clientes geradores de DLQ.
Conclusão
O DLQ não é um «cesto de lixo», mas um circuito de confiabilidade controlado. Regras claras de entrada, metadados ricos, idempotação e dedução, redesenvolvimentos dosados seguros, disciplina de circuitos e observabilidade transformam mensagens venenosas de ameaça para o SLO em processo de engenharia controlada - com playbooks compreensíveis, custos previstos e um mínimo de exposição aos usuários.