Por que utilizar filas?
Filas são um componente importante em uma arquitetura moderna, pois oferecem muitos benefícios, como por exemplo, facilitam a escalabilidade do sistema, aumentam a disponibilidade e confiabilidade da sua aplicação.
O uso de filas possibilita uma comunicação assíncrona entre aplicações. Os produtores publicam uma mensagem que será recebida e processada posteriormente pelos consumidores, dessa forma, os produtores não necessitam aguardar por uma resposta imediata dos consumidores, oferecendo mais fluidez e desempenho para os clientes que estão utilizando a aplicação e não ficarão bloqueados até que a mensagem seja processada.
A fila também é tolerante à falhas, pois armazena algumas cópias das mensagens recebidas em diferentes servidores, oferecendo resiliência e confiabilidade. Dessa forma, a fila garante que a mensagem não será perdida caso ocorram falhas em algum servidor, e será capaz de entregar a mensagem com sucesso aos consumidores.
Outra vantagem de utilizar filas é ter a capacidade de receber e recuperar mensagens mesmo se a aplicação ficar indisponível por algum tempo. Isso desacopla sua arquitetura, torna as aplicações independentes e possibilita que produtores não dependam dos consumidores estarem disponíveis e aptos a receber mensagens, pois a comunicação entre eles não é feita de maneira síncrona.
Embora a utilização de filas ofereça inúmeras vantagens, temos que tomar cuidado com o processamento das mensagens, especialmente em cenários não previstos e que geram erros.
Se uma aplicação não conseguir processar uma mensagem com sucesso, a mensagem continuará na fila, disponível para qualquer consumidor, e todos que receberem a mensagem irão processá-la novamente com falha e não removerão a mensagem da fila, ocasionando um loop de processamentos com falha.
É necessário um mecanismo que retire a mensagem da fila, eliminando a sequência de erros e que forneça um meio para que seja possível depurar a mensagem e descobrir o porque ela não foi processada com sucesso.
É importante mencionar que sua aplicação precisa garantir a idempotência no processamento de qualquer mensagem, pois isso garante segurança e não causa efeitos colaterais ao reprocessar mensagens. Escrevi um post somente sobre este assunto que pode ser acessado clicando aqui.
Dead-letter queue (DLQ)
Dead-letter queue é um termo que pode ser traduzido para “fila de mensagens mortas ou não entregues”.
Esse componente é uma fila como você já conhece, com a diferença que ela recebe mensagens que não foram processadas com sucesso. Isso possibilita isolar mensagens problemáticas e analisar o porque o processamento delas não ocorreu com sucesso.
Idealmente, cada fila deve conter uma DLQ associada a ela.
São vários os motivos que podem ocasionar erro durante o processamento de uma mensagem. Identificá-los é seu trabalho e para isso é necessário mapear todos os cenários possíveis de erro e realizar as devidas validações de regra de negócio. Se você possui uma aplicação que recebe dados externos, você precisa validar, por exemplo, se os dados recebidos estão corretos e de fato existem no banco de dados que você pretende interagir.
Você pode configurar alarmes e envio de e-mails que serão enviados quando uma mensagem é publicada na fila DLQ, e a partir disso, analisar logs, recuperar o conteúdo da mensagem problemática e depurar a aplicação consumidora para entender o porque a mensagem não foi processada com sucesso.
Algumas filas oferecem a possibilidade de mover a mensagem da DLQ para a fila novamente, permitindo que ela seja reprocessada outra vez pelos consumidores. Há também configurações que definem o número máximo de tentativas antes de mover mensagens para a DLQ. Cabe a você explorar o potencial da fila que sua aplicação utiliza e tirar o melhor proveito dela.
Conclusão
O uso de dead-letter queues é altamente recomendado, porque ao isolar mensagens problemáticas e alertar o time responsável, é possível analisar o problema o quanto antes e realizar ações que minimizem o impacto desse erro.
Muitas vezes só percebemos que ocorreu algum problema quando o cliente foi impactado e liga com questionamentos e reclamações. Ao usar uma fila DLQ, podemos antecipar a análise e resolução do problema, corrigindo-o mais rápido possível e podendo até informar ao cliente que já estamos cientes do ocorrido e que a solução já está sendo desenvolvida.
Isso gera mais credibilidade ao negócio e transmite mais confiança para o cliente.