Tutorial: Configurando uma fila do AWS SQS com DLQ

Funcionamento do SQS com DLQ

O que é AWS SQS:

O Simple Queue Service da AWS, ou apenas SQS, é um serviço gerenciado de filas da AWS, capaz de trafegar mensagens entre aplicações e serviços.

Com o SQS é possível enviar e receber mensagens de forma assíncrona e eficiente, sem a preocupação de armazenamento de eventos gerados e não lidos.

A fonte de informação de um SQS, ou seja quem pode publicar mensagens nele, pode ser uma aplicação em execução em um ECS, um Lambda ou um SNS. Nesse último caso, é possível criar uma inscrição entre o SQS e o SNS, de tal modo que a cada mensagem publicada no SNS seja automaticamente copiada para a fila.

O consumidor de uma fila no SQS pode ser uma aplicação em um ECS ou uma função Lambda, dentre outros exemplos.

Porque criar uma DLQ:

Quando um consumidor está tratando uma mensagem da fila do SQS, ela se torna invisível para uma outra instância do mesmo consumidor, para evitar que a mesma mensagem seja consumida mais de uma vez. Esse parâmetro é chamado de tempo de visibilidade e pode ser configurado por fila.

Para que a mensagem seja de fato retirada da fila, o consumidor deve efetivamente informá-la do sucesso do tratamento de tal mensagem.

Eventualmente, o consumidor pode falhar no tratamento de uma mensagem, por uma série de razões. Quando isso acontece, a mensagem volta para a fila para ser reprocessada. Porém, caso o erro seja persistente, como um parâmetro obrigatório faltando ou algum campo com um tipo errado, essa mesma mensagem ficará presa na fila, tentando ser tratada até que o tempo de retenção configurado expire para ela.

Esse evento traz consequências muito danosas para a aplicação, que pode desde consumir muitos recursos computacionais tentando, sem sucesso, tratar a mensagem por vários dias, até mesmo paralizar o consumidor de toda a fila.

Felizmente, existe um mecanismo chamado Dead Letter Queue, ou apenas DLQ, que pode ser configurado para retirar a mensagem de uma fila após X tentativas de falhas. Essa mensagem é então encaminhada para uma outra fila, a DLQ.

A vantagem desse mecanismo é que tudo acontece a nível de infraestrutura na AWS, sem a necessidade de se fazer nada na aplicação que consome as mensagens.

Criando a DLQ:

Dentro de uma stack criada com o AWS CDK, crie uma fila como outra qualquer, como no exemplo a seguir:

Aqui é uma boa oportunidade de configurar o período de retenção de uma mensagem no SQS para um tempo maior do que o padrão de 4 dias. Nesse exmplo, a propriedade retentionPeriod foi configurada para 10 dias.

Configurando o redrive policy da DLQ:

Agora essa fila pode ser configurada como uma DLQ de fato, como no trecho a seguir:

Veja que a propriedade queue recebe a fila que foi criada anteriormente.

A propriedade maxReceiveCount é que configura quantas vezes uma mensagem pode falhar em seu tratamento antes de ser movida para a DLQ. Aqui foi configurada com o valor 3, o que significa que se o consumidor lançar 3 exceções para a mesma mensagem durante seu tratamento, essa mensagem é retirada da fila principal e movida para essa, que é sua DLQ.

Criando a fila principal com sua DLQ:

Por último, deve-se criar a fila principal, que dentre outros parâmetros, deve ser configurada para utilizar a DLQ que foi criada anteriormente, no trecho a seguir:

Veja que o parâmetro deadLetterQueue recebeu a DLQ que foi criada anteriormente.

Obviamente, essa fila pode ser inscrita em um tópico do AWS SNS, sem nenhuma modificação por conta da DLQ que foi associada a ela.

Vale a pena lembrar também que para o mecanismo da DLQ funcionar, basta que o consumidor lance uma exceção na sua função que consome a mensagem, caso haja algum problema em seu tratamento. Isso já é suficiente para que o SQS entenda que houve uma falha no tratamento da mensagem.

A mensagem que é encaminhada para a DLQ ficará disponível por 10 dias, nesse caso, antes de ser automaticamente apagada pelo SQS. A informação contida na mensagem, bem como seu MessageId, servem como evidência do problema que ocorreu.

Se quiser aprender como construir uma aplicação com Spring Boot para consumir filas do SQS utilizando o JMS, consulte esse tutorial.

Como a DLQ é uma fila como outra qualquer, ela também pode ser consumida por uma outra aplicação para tentar reprocessar a mensagem ou gerar algum tipo de relatório.

Conclusão:

Veja como é fácil criar uma fila e configurar o seu mecanismo de DLQ. Esse mesmo princípio pode ser utilizado em funções Lambda, com tratamento de eventos assíncronos.

Utilizar esse mecanismo de fácil construção pode evitar muitos problemas inesperados nos consumidores de fila do SQS, por isso, sempre o utilize.

Se você gostou desse conteúdo, siga-me no LinkedIn, para receber notificações de outros tutoriais como esse!

Referência:

Esse artigo foi baseado nos conceitos ministrados nesse curso online: Curso criando microsserviços em Java com AWS ECS e Fargate

Quem sou eu:

  • Trabalhei diariamente com as tecnologias apresentadas nesse blog por quase 4 anos, atuando como desenvolvedor de soluções hospedadas na AWS;
  • Tenho lecionado disciplinas de cloud computing, principalmente AWS, em curso de pós-graduação há quase 10 anos;
  • Tenho livros publicados sobre o assunto;
  • Faço parte da comunidade global AWS Community Builder 2020/2021, criada pela própria AWS.