Tecnologias/03 - Filas/03 - Amazon SQS2 min
Retry, DLQ e Lambda com SQS
Retry
Retry é uma nova tentativa de processamento. No SQS, deixar uma mensagem sem exclusão permite que ela reapareça após o visibility timeout. Isso não garante que a próxima tentativa terá sucesso: um conteúdo inválido pode falhar indefinidamente.
Uma falha transitória, como indisponibilidade de um serviço, pode desaparecer. Uma mensagem sem um campo obrigatório geralmente continuará inválida. Registrar a causa e evitar repetição imediata sem limite facilita recuperar o fluxo.
Dead-letter queue
Uma DLQ é outra fila destinada a mensagens que excedem o limite configurado de
recebimentos. A política de redrive usa maxReceiveCount para definir esse limite.
Ele conta recebimentos, não apenas exceções registradas pelo código.
Mover uma mensagem para a DLQ isola a falha; não corrige seu conteúdo. Redrive é movê-la de volta para processamento depois de tratar a causa. A DLQ também tem retenção, e seu prazo deve considerar a investigação e recuperação.
Em FIFO, retirar uma mensagem problemática para DLQ pode permitir que mensagens posteriores avancem e romper a sequência lógica exigida pelo negócio. Referência: DLQ.
Integração com Lambda
Uma associação de origem de eventos do Lambda consulta a fila e invoca a função com lotes. Quando o processamento é bem-sucedido, a integração exclui as mensagens. Se a invocação falha, por padrão o lote pode voltar à fila após o timeout.
Com resposta parcial de lote habilitada (ReportBatchItemFailures), a função pode
informar quais itens falharam para evitar repetir os itens bem-sucedidos.
{
"batchItemFailures": [
{"itemIdentifier": "id-da-mensagem-que-falhou"}
]
}
Esse JSON é o formato de resposta do handler; o identificador deve ser o messageId
real do item. Habilitar o recurso na associação é necessário. Em FIFO, o tratamento de
falhas também precisa preservar a ordem, reportando os itens não processados conforme
as orientações da integração.
A integração pode entregar eventos mais de uma vez. Portanto, o handler continua precisando de idempotência. Referência: Lambda com SQS.
Aprofundamento aplicado
Uma exceção no nível errado repete trabalho desnecessário
Em um lote de dez mensagens, nove podem ter concluído e uma falhar. Com resposta parcial configurada, retorne a falha daquele item. Se o handler lança uma exceção sem produzir a resposta parcial, o lote inteiro pode ser tratado como falha.
Para FIFO, a orientação é parar após a primeira falha e informar também as mensagens
não processadas, preservando a ordem. Isso exige cuidado com um Promise.all indiscriminado.
Referência: erros e respostas parciais.
Redrive tem capacidade e semântica
Reenviar milhares de mensagens de DLQ após corrigir o código pode sobrecarregar o mesmo banco que atende tráfego normal. Controle ritmo e acompanhe erros novos. Uma mensagem antiga também pode conter schema que a versão atual deixou de entender.
Exercício: simule lote com falha no terceiro item e descreva respostas para Standard e FIFO. Resultado esperado: Standard pode preservar sucessos independentes; FIFO precisa respeitar a sequência e reportar itens que não foram processados.
Relacionado: 3. Visibility Timeout e Exclusão no SQS · Lambda · Back Pressure.
Parte de Amazon SQS