3
respostas

[Dúvida] Atomicidade

Estou com uma dúvida, pois recentemente participei de uma ENTREVISTA para desenvolvedor Java Pleno e o recrutador me fez a seguinte pergunta “Se tenho um microsserviço de lançamentos e preciso inserir 10 registros no banco e enviar 1 mensagem para o RabbitMQ para cada lançamento, como posso garantir que todas as 10 inserções sejam confirmadas no banco antes de enviar as mensagens? Ou seja, como garantir que, se acontecer uma falha em uma das inserções, nenhuma mensagem parcial seja enviada para o RabbitMQ? Qual padrão ou técnica poderia ser usado para alcançar essa atomicidade?”.

Não soube responder essa pergunta.

3 respostas

Olá Yan! Como vai?

Essa pergunta é realmente nos faz pensar bastante, e depois de um tempo cheguei na seguinte conclusão: para garantir que todas as 10 inserções sejam confirmadas no banco de dados antes de enviar qualquer mensagem para o RabbitMQ, você pode usar o padrão de "Transação de Dois Estágios" (Two-Phase Commit) ou o padrão de "Saga".

  1. Transação de Dois Estágios (2PC): Este é um protocolo de coordenação de transações distribuídas que garante que todas as partes de uma transação sejam concluídas com sucesso antes de serem confirmadas. No entanto, ele pode ser complexo e não é sempre a melhor escolha para microsserviços devido à sua natureza síncrona e ao potencial de criar gargalos.

  2. Padrão Saga: Este é um padrão mais adequado para microsserviços, pois permite que você lide com transações distribuídas de forma assíncrona. Uma saga é uma sequência de transações locais que são coordenadas por meio de mensagens. Se uma das transações falhar, a saga executa uma série de transações de compensação para desfazer as mudanças realizadas pelas transações anteriores. Isso permite que você mantenha a atomicidade em um ambiente distribuído sem a necessidade de bloquear recursos por longos períodos.

No seu caso, com o uso do RabbitMQ, você pode implementar uma saga onde cada inserção no banco de dados é uma etapa da saga. Somente após todas as inserções serem confirmadas, você enviaria as mensagens para o RabbitMQ. Se uma inserção falhar, você poderia acionar transações de compensação para desfazer as inserções já realizadas.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Asimm, muito bacana. Nos outros cursos que irão sair dessa formação, nós iremos aprender isso?

Bom dia, Yan!

Não consigo te falar isso com 100% de certeza já que é um segredo até para nós monitores, porém, a Alura está em um momento de mudanças e os nossos novos conteúdos estarão cada vez mais com um nível profissional, focando em padrões e tecnologias cada vez mais comuns e utilizadas ao nível profissional.

Bons estudos!