Eu tenho uma função lambda que recebe dados de usuários recém-inscritos de uma fila de mensagens e insere esses mesmos dados em dois bancos de dados diferentes.
Esses dois bancos de dados pertencem a dois microsserviços diferentes. Primeiro - serviço de usuários que usa RDS postgres e segundo - serviço de administração cujo banco de dados é basicamente uma única tabela DynamoDB.
Quero obter um comportamento "tudo ou nada" para inserções de dados nos dois bancos de dados - ou a inserção em ambos os bancos de dados é bem-sucedida ou as inserções não acontecem em nenhum deles.
- Como posso ter uma “transação atômica” para inserção nos dois bancos de dados, conseguindo um comportamento “tudo ou nada”?
- E se os dados forem inseridos na tabela DynamoDB do serviço administrativo, mas não forem inseridos na tabela postgres do serviço de usuários por algum motivo - como posso "reverter" a inserção no DyanamoDB?
Posso alcançar esse tipo de funcionalidade no nível do código, mas o código ficaria bastante confuso se digamos que eu tenha inserções "tudo ou nada" em 5 em vez de 2 bancos de dados diferentes.
Eu me pergunto se existe alguma maneira padrão de ter um comportamento semelhante ao de uma transação atômica quando se trata de interagir com diferentes bancos de dados.
Sim, são chamadas de transações distribuídas . Requer um componente extra, um coordenador de transação, que implemente um protocolo de commit de duas fases. Se não quiser implementá-lo em seu código, você precisará configurar uma das implementações de terceiros existentes.