DEV Community

Jonatan Lima (balu)
Jonatan Lima (balu)

Posted on • Edited on

Evitando consumo de mensagens duplicadas com Redis

Nesse artigo vou tratar de uma forma de evitar o consumo de mensagens duplicadas via RabbitMQ, a solução que será demonstrada foi elaborada por Alison Machado, Jonatan Pedraza e por esse quem vos escreve Jonatan Lima.

Cenário

Primeiro vamos entender o cenário.

Scenario

O processo inicia quando o Payment Gateway se comunica com Webhook que por sua vez publica uma mensagem no RabbitMQ, onde o Service consome a mensagem.

Problema

Por motivos de instabilidade o Payment Gateway pode enviar o mesmo Webhook, gerando o envio da mesma mensagem para o RabbitMQ que por sua vez enviará a mensagem duplicada para o Service.

Como não existe uma tratativa no CONSUMER para verificar se a mensagem já foi consumida e processada com sucesso, o USE CASE é chamado novamente.

Problem

Solução

Após conversarmos sobre várias formas de resolver o problema, chegamos na que melhor se encaixa no nosso cenário.

Solution

Decidimos utilizar o Redis para armazenar uma hash, que será gerada no momento em que o Consumer consumir a mensagem, após a geração da hash consultamos no redis para verificar se a mensagem já foi processada com sucesso, caso a hash seja encontrada não processamos a mensagem novamente.

Se a hash não for encontrada, o fluxo normal da chamada do USE CASE é realizado, caso tudo ocorra como o esperado, no final do fluxo inserimos a hash no Redis.

Pontos de atenção

  • Não esqueça de adicionar o ttl da chave que será inserida no Redis.
  • Caso queira que os métodos implementados do Redis sejam rejeitados no momento em que a conexão seja perdida, desabilite offline queue.

Projeto no Github

https://github.com/jdssl/redis-saves

Heroku

Simplify your DevOps and maximize your time.

Since 2007, Heroku has been the go-to platform for developers as it monitors uptime, performance, and infrastructure concerns, allowing you to focus on writing code.

Learn More

Top comments (1)

Collapse
 
jon710 profile image
João Luis Moraes

Interessante. Nesse caso, poderíamos usar Redis sets ou sorted sets pra atingir o mesmo objetivo?

Qodo Takeover

Introducing Qodo Gen 1.0: Transform Your Workflow with Agentic AI

Rather than just generating snippets, our agents understand your entire project context, can make decisions, use tools, and carry out tasks autonomously.

Read full post

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay