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".
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.
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 ✓.