DEV Community

Jonatan Lima (balu)
Jonatan Lima (balu)

Posted on • Updated 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

Oldest 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?