Implementando o Dual Write com Mensageria PostgreSQL
Tags: java, mensageria, springboot, postgres
Published: 2024-03-14 12:09:41

Na era dos negócios digitais, a garantia da consistência dos dados é uma preocupação crítica. Em processos como o processamento de pedidos, onde a precisão e integridade das informações são essenciais, estratégias eficazes para gerenciar transações simultâneas são indispensáveis. Neste artigo, exploraremos como o Dual Write, combinado com a mensageria do PostgreSQL, pode ser uma solução poderosa para alcançar esse objetivo.

**Dual Write: Uma Introdução**

O Dual Write é uma técnica que envolve escrever dados simultaneamente em dois sistemas ou bancos de dados. Essa abordagem é adotada para garantir a consistência e integridade dos dados, especialmente em cenários onde múltiplas transações ocorrem simultaneamente.

Lidar com erros é uma parte essencial do processo de Dual Write. Se ocorrer uma falha na gravação principal, o sistema será automaticamente direcionado para um agendador de tarefas, que neste contexto específico utiliza a funcionalidade 'Scheduled' do framework Spring Boot. Este agendador tentará a cada 2 minutos, garantindo que nenhum pedido seja perdido ou processado de forma inadequada. Ao ser acionado, o agendador recupera todos os pedidos que não foram concluídos e os encaminha para o tópico 'pg_notify' com o devido payload. Assim que o payload é enviado, o sistema entra em um modo de escuta ('listen') para processar a mensagem e, consequentemente, os pedidos associados.

**Cenário de Uso: Processamento de Pedidos**

Considere um cenário em sistema de gerenciamento de pedido: a liberação de um pedido. Neste caso, precisamos atualizar o status do pedido em um banco de dados PostgreSQL e garantir que a transação seja concluída sem falhas após a confirmação do pagamento. Se ocorrer algum erro durante o processo, é crucial ter um mecanismo de recuperação confiável.

**Pedido:** Essa classe representa a tabela de pedido e sempre vou salvar os dados com status Aberto para depois validar se o pedido será concluído.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1iqkby022m931077x6ry.png)



**Implementação com Mensageria do PostgreSQL
**
Para implementar o Dual Write, podemos aproveitar as capacidades de mensageria do PostgreSQL. Ao escrever os dados no banco principal, também podemos aproveitar a mesma arquitetura e utilizar o banco para nos ajudar e sem precisar instalar e integrar com outras soluções como Kafka ou RabbitMQ. Isso garante que, mesmo em caso de falha na gravação principal, os dados ainda possam ser recuperados.

Tarefa: Essa classe representa um agendamento feito para verificar os pedidos que estão pendentes e caso encontre será encaminhado para mensageria do Postgres com tópico list_pedido..


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2wxa1hfcoahro5zgt8hn.png)




Agora precisamos fazer com que o Postgres processa esse evento e verifica como é situação do pedido, lembrando que vou só simular que será confirmado o pagamento e atualizar para concluído, vou aqui apresentar como fica essa funcionalidade do consumer desse evento, mas essa funcionalidade eu acabei colocando no mesmo projeto para facilitar apresentação do mesmo, porém posso criar projeto separado somente para consumir esses eventos.  


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zzqdphk7mv41nw1qamcu.png)

 

Considerações:

Implementar o Dual Write com mensageria PostgreSQL é uma estratégia robusta para garantir a consistência dos dados em processos críticos, como o processamento de pedidos. Ao escrever dados simultaneamente em dois sistemas, podemos minimizar o risco de falhas e garantir que as transações sejam concluídas de forma confiável. No entanto, é essencial gerenciar cuidadosamente os erros e considerar os impactos no desempenho e na escalabilidade do sistema. Com uma implementação cuidadosa e uma abordagem pragmática, o Dual Write pode se tornar uma ferramenta poderosa para maximizar a integridade dos dados em ambientes empresariais dinâmicos.

Segue link repositório: https://github.com/adrianoaguiardez/dual-write-mensageria-postgres