Filas de mensagens mortas do Amazon SQS - Amazon Simple Queue Service

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Filas de mensagens mortas do Amazon SQS

O Amazon SQS oferece suporte a filas de mensagens mortas (DLQ), que outras filas (filas de origem) podem usar como destinos para mensagens que não podem ser processadas (consumidas) com êxito. As filas de mensagens não entregues são úteis para depurar a aplicação ou o sistema de mensagens, pois permitem que você isole mensagens não consumidas a fim de determinar por que o processamento não obteve êxito. Para obter informações sobre como configurar uma fila de mensagens não entregues usando o console do Amazon SQS, consulte Configurar uma fila de mensagens mortas (console). Depois de depurar a aplicação do consumidor ou de ela estar disponível para consumir a mensagem, você poderá usar o recurso de redirecionamento da fila de mensagens não entregues para mover as mensagens de volta para a fila de origem.

Importante

O Amazon SQS não cria fila de mensagens mortas automaticamente. Primeiro, é necessário criar uma fila antes de designar para ela uma fila de mensagens mortas.

Como as filas de mensagens mortas funcionam?

Algumas vezes, as mensagens não podem ser processadas devido a uma variedade de possíveis problemas, como condições de erro das aplicações de produtores/consumidores ou uma mudança de estado inesperada que causa um problema com o código da sua aplicação. Por exemplo, se um usuário fizer um pedido na web com um ID de produto específico, mas esse ID do produto for excluído, o código da loja da web falhará e exibirá um erro. Além disso, a mensagem com a solicitação do pedido será enviada para uma dead-letter queue.

Ocasionalmente, os produtores e os consumidores podem não conseguir interpretar aspectos do protocolo que eles usam para se comunicar, causando a perda ou corrupção de mensagens. Além disso, os erros de hardware do consumidor podem corromper o conteúdo da mensagem.

A política de redirecionamento especifica a fila de origem, a fila de mensagens mortas e as condições sob as quais o Amazon SQS move mensagens da fila anterior para a última se o consumidor da fila de origem não puder processar uma mensagem por um número especificado de vezes. O maxReceiveCount é o número de vezes que um consumidor tenta receber uma mensagem de uma fila sem excluí-la antes de ser movida para a fila de mensagens mortas. Configurar o maxReceiveCount com um valor baixo, como 1, resultaria em qualquer falha receber uma mensagem para fazer com que a mensagem fosse movida para a fila de mensagens mortas. Essas falhas incluem erros de rede e erros de dependência do cliente. Para garantir que seu sistema seja resiliente contra erros, defina o maxReceiveCount alto o suficiente para permitir novas tentativas suficientes.

A política de permissão de redirecionamento especifica quais filas de origem podem acessar a fila de mensagens mortas. Essa política aplica-se a uma potencial fila de mensagens mortas. Você pode escolher se deseja permitir todas as filas de origem, permitir filas de origem específicas ou negar todas as filas de origem. O padrão é permitir que todas as filas de origem usem a fila de mensagens mortas. Se você optar por permitir filas específicas (usando a opção byQueue), você pode especificar até 10 filas de origem usando o nome do recurso da Amazon (ARN) da fila de origem. Se você especificar denyAll, a fila não pode ser usada como uma fila de mensagens mortas.

Para especificar uma fila de mensagens não entregues, é possível usar o console ou os AWS SDKs. Você deve fazer isso para cada fila que envia mensagens para uma dead letter queue. Várias filas do mesmo tipo podem se dirigir a uma única fila de mensagens mortas. Para obter mais informações, consulte Configurar uma fila de mensagens mortas (console) e os atributos RedrivePolicy eRedriveAllowPolicy da ação CreateQueue ou SetQueueAttributes.

Importante

A fila de mensagens mortas de uma fila FIFO também deve ser uma fila FIFO. Da mesma forma, a fila de mensagens mortas de uma fila padrão também deve ser uma fila padrão.

Você deve usar a mesma Conta da AWS para criar a fila de mensagens mortas e outras filas que enviam mensagens para a fila de mensagens mortas. Além disso, as dead letter queues devem residir na mesma região que as outras filas que usam a dead letter queue. Por exemplo, se você criar uma fila na região Leste dos EUA (Ohio) e quiser usar uma fila de mensagens mortas com ela, a segunda fila também deverá estar na região Leste dos EUA (Ohio).

Para filas comuns, a validade de uma mensagem é sempre baseada em seu carimbo de data/hora de enfileiramento original. Quando uma mensagem é movida para uma fila de mensagens mortas, o carimbo de data/hora de enfileiramento permanece inalterado. A métrica ApproximateAgeOfOldestMessage indica quando a mensagem foi movida para a fila de mensagens mortas, não quando a mensagem foi originalmente enviada. Por exemplo, suponha que uma mensagem fique um dia na fila original antes de ser movida para uma fila de mensagens mortas. Se o período de retenção da fila de mensagens mortas for de quatro dias, a mensagem será excluída da fila de mensagens mortas após três dias e a ApproximateAgeOfOldestMessage será de três dias. Portanto, é uma prática recomendada definir sempre o período de retenção de uma fila de mensagens mortas para ser maior do que o período de retenção da fila original.

Para filas FIFO, o carimbo de data/hora da fila é redefinido quando a mensagem é movida para uma fila de mensagens não entregues. A métrica ApproximateAgeOfOldestMessage indica quando a mensagem foi movida para a fila de mensagens não entregues. No mesmo exemplo acima, a mensagem é excluída da fila de mensagens não entregues após quatro dias e ApproximateAgeOfOldestMessage é de quatro dias.

Quais são os benefícios das filas de mensagens mortas?

A principal tarefa de uma fila de mensagens mortas é lidar com o ciclo de vida de mensagens não consumidas. Uma fila de mensagens mortas permite que você separe e isole mensagens que não podem ser processadas corretamente para determinar por que seu processamento não obteve êxito. Configurar uma dead letter queue permite que você faça o seguinte:

  • Configurar um alarme para todas as mensagens movidas para uma fila de mensagens mortas.

  • Examinar logs para encontrar as exceções que podem ter causado a entrega de mensagens a uma fila de mensagens mortas.

  • Analisar o conteúdo de mensagens entregues a uma fila de mensagens mortas para diagnosticar problemas de software ou de hardware do produtor ou consumidor.

  • Determinar se você concedeu ao consumidor tempo suficiente para processar mensagens.

Como os diferentes tipos de fila lidam com falhas de mensagens?

Filas padrão

As filas padrão continuam a processar mensagens até a expiração do período de retenção. Esse processamento contínuo de mensagens minimiza as chances de sua fila ser bloqueada por mensagens que não podem ser processadas. O processamento contínuo de mensagens também fornece uma recuperação mais rápida da fila.

Em um sistema que processa milhares de mensagens, ter um grande número de mensagens que o consumidor repetidamente falha em confirmar e excluir pode aumentar os custos e colocar uma carga extra no hardware. Em vez de tentar processar mensagens com falha até que elas expirem, é melhor movê-las para uma dead letter queue após algumas tentativas de processamento.

nota

As filas padrão permitem grande número de mensagens em trânsito. Se a maioria de suas mensagens não puder ser consumida e não for enviada para uma fila de mensagens mortas, sua taxa de processamento de mensagens válidas poderá diminuir. Assim, para manter a eficiência da fila, garanta que sua aplicação lide com o processamento de mensagens corretamente.

Filas FIFO

As filas FIFO garantem o processamento exatamente uma vez, consumindo mensagens de um grupo de mensagens em sequência. Assim, embora o consumidor possa continuar a recuperar mensagens ordenadas de outro grupo de mensagens, o primeiro grupo permanece indisponível até que a mensagem que está bloqueando a fila seja processada com sucesso ou movida para uma fila de mensagens não entregues.

nota

As filas FIFO permitem um número menor de mensagens em trânsito. Assim, para evitar que a fila FIFO seja bloqueada por uma mensagem, garanta que sua aplicação lide com o processamento de mensagens corretamente.

Quando uma mensagem é movida de uma fila FIFO para uma DLQ FIFO, o ID de eliminação de duplicação da mensagem original será substituído pelo ID da mensagem original. Isso acontece para garantir que a eliminação de duplicação da DLQ não impeça o armazenamento de duas mensagens independentes que, por acaso, compartilham o mesmo ID de eliminação de duplicação.

Quando devo usar uma fila de mensagens mortas?

Use as filas de mensagens mortas com filas padrão. Você deve tirar proveito das fila de mensagens mortass sempre que seus aplicativos não dependerem de ordenação. As dead letter queues podem ajudá-lo a solucionar as operações de transmissão de mensagens incorretas.

nota

Mesmo quando você usa dead letter queues, deve continuar a monitorar suas filas e tentar enviar mensagens que falham por razões transitórias.

Não utilize as filas de mensagens mortas para diminuir o número de mensagens e reduzir a possibilidade de exposição de seu sistema a mensagens poison-pill (mensagens que podem ser recebidas, mas que não podem ser processadas).

Não use uma fila de mensagens mortas com filas padrão quando quiser repetir a transmissão de uma mensagem indefinidamente. Por exemplo, não use uma fila de mensagens mortas se o programa precisar esperar que um processo dependente se torne ativo ou disponível.

Não use uma fila de mensagens mortas com uma fila FIFO se você não quiser interromper a ordem exata das mensagens ou operações. Por exemplo, não use uma fila de mensagens mortas com instruções em uma Edit Decision List (EDL) para um pacote de edição de vídeo, onde a alteração da ordem de edições muda o contexto de edições subsequentes.

Mover mensagens para fora de uma fila de mensagens mortas

Você pode usar redirecionamento de fila de mensagens mortas para gerenciar o ciclo de vida de mensagens não consumidas. Depois de investigar os atributos e os metadados relacionados disponíveis para mensagens não consumidas em uma fila de mensagens não entregues padrão ou FIFO, você pode recuperar as mensagens para suas filas de origem. O redirecionamento da fila de mensagens mortas reduz o faturamento de chamadas de API colocando em lote as mensagens enquanto as move.

A tarefa de redirecionamento usa as APIs SendMessageBatch, ReceiveMessage e DeleteMessageBatch do Amazon SQS em nome do usuário para redirecionar as mensagens. Portanto, todas as mensagens redirecionadas são consideradas novas mensagens com um novo messageid, enqueueTime e período de retenção. O preço da redirecionamento de fila de mensagens mortas usa o número de chamadas de API chamadas e faturas com base no Preço do Amazon SQS.

Por padrão, a redirecionamento da fila de mensagens mortas move as mensagens de uma fila de mensagens mortas para uma fila de origem. No entanto, também será possível configurar qualquer outra fila como o destino de redirecionamento se as filas forem do mesmo tipo. Por exemplo, se a fila de mensagens não entregues for uma fila FIFO, a fila de destino de redirecionamento também deverá ser uma fila FIFO. Além disso, você pode configurar a velocidade de redirecionamento para definir a taxa na qual o Amazon SQS move mensagens. Para obter instruções sobre como configurar o redirecionamento de uma fila de mensagens não entregues, consulte Configurar redirecionamento de fila de mensagens não entregues.

nota

O Amazon SQS não oferece suporte à filtragem e modificação de mensagens enquanto as redireciona da fila de mensagens não entregues.

Uma tarefa de redirecionamento de fila de mensagens não entregues pode ser executada no máximo 36 horas. O Amazon SQS oferece suporte a um máximo de 100 tarefas de redirecionamento ativo por conta.

Quando as mensagens são redirecionadas de uma fila de mensagens não entregues FIFO, a groupID e a deduplicationID da mensagem permanecem as mesmas e a mensagem recebe uma nova messageID.

As filas de mensagens não entregues do Amazon SQS redirecionam as mensagens na ordem em que são recebidas, começando pela mais antiga. No entanto, a fila de destino ingere as mensagens redirecionadas, bem como as novas mensagens de outros produtores, de acordo com a ordem em que as recebe. Por exemplo, se um produtor enviar mensagens para uma fila FIFO de origem ao receber simultaneamente mensagens redirecionadas de uma fila de mensagens não entregues, as mensagens redirecionadas serão combinadas com as novas mensagens do produtor.

Solução de problemas de filas de mensagens mortas

Em alguns casos, as filas de mensagens mortas do Amazon SQS podem não se comportar conforme esperado. Esta seção fornece uma visão geral dos problemas comuns e mostra como resolvê-los.

Visualizar mensagens usando o console pode fazer com que elas sejam movidas para uma fila de mensagens mortas

O Amazon SQS considera a visualização de uma mensagem no console para a política de redirecionamento da fila correspondente. Dessa forma, se você visualizar uma mensagem no console pelo número de vezes especificado na política de redirecionamento da fila correspondente, a mensagem será movida para a fila de mensagens mortas da fila correspondente.

Para ajustar esse comportamento, você pode executar uma das seguintes ações:

  • Aumentar a definição de Maximum Receives da política de redirecionamento da fila correspondente.

  • Evitar a visualização de mensagens da fila correspondente no console.

O NumberOfMessagesSent e o NumberOfMessagesReceived de uma fila de mensagens mortas não correspondem

Se você enviar uma mensagem para uma dead letter queue manualmente, ela será capturada pela métrica NumberOfMessagesSent. No entanto, se uma mensagem for enviada para uma dead-letter queue como resultado de uma falha na tentativa de processamento, ela não será capturada por essa métrica. Assim, é possível que os valores de NumberOfMessagesSent e NumberOfMessagesReceived sejam diferentes.

Para obter informações sobre como criar e configurar o redirecionamento de uma fila de mensagens não entregues

Observe que o redirecionamento da fila de mensagens mortas exige que você defina as permissões apropriadas para que o Amazon SQS receba mensagens da fila de mensagens mortas e envie mensagens para a fila de destino. Em caso de permissões insuficientes, a fila de mensagens mortas redirecionadas para a fila de origem não inicia o redirecionamento da mensagem e pode falhar na tarefa. Você pode exibir o status da tarefa de redirecionamento de mensagens para corrigir os problemas e tentar novamente.