Práticas recomendadas para lidar com atualizações simultâneas no DynamoDB
Em sistemas distribuídos, vários processos ou usuários podem tentar modificar os mesmos dados ao mesmo tempo. Sem o controle de simultaneidade, essas gravações simultâneas podem resultar em perda de atualizações, dados inconsistentes ou condições de disputa. O DynamoDB oferece vários mecanismos para ajudar a gerenciar o acesso simultâneo e manter a integridade dos dados.
nota
Operações de gravação individuais, como UpdateItem, são atômicas e sempre operam na versão mais recente do item, independentemente da simultaneidade. Estratégias de bloqueio são necessárias quando a aplicação precisa ler um item e depois gravá-lo novamente com base no valor de leitura (um ciclo de leitura, modificação e gravação), pois outro processo pode modificar o item entre a leitura e a gravação.
Há duas estratégias principais para lidar com atualizações simultâneas:
-
Bloqueio positivo: presume que os conflitos são raros. Ele permite acesso simultâneo e detecta conflitos no momento da gravação usando gravações condicionais. Se um conflito for detectado, a gravação falhará e a aplicação poderá tentar novamente.
-
Bloqueio negativo: presume que existe a probabilidade de conflitos. Ele impede o acesso simultâneo adquirindo acesso exclusivo a um recurso antes de modificá-lo. Outros processos devem esperar até que o bloqueio seja liberado.
A seguinte tabela resume as abordagens disponíveis no DynamoDB:
| Abordagem | Mecanismo | Melhor para |
|---|---|---|
| Bloqueio otimista | Atributo da versão + gravações condicionais | Baixa contenção, novas tentativas de baixo custo |
| Bloqueio negativo (transações) | TransactWriteItems |
Atomicidade de vários itens, contenção moderada |
| Bloqueio negativo (cliente de bloqueio) | Tabela de bloqueio dedicada com concessão e hearbeat | Fluxos de trabalho de longa duração, coordenação distribuída |
Escolher uma estratégia de controle de simultaneidade
Siga as diretrizes abaixo para escolher a abordagem ideal para sua workload:
- Use o bloqueio positivo quando:
-
Os conflitos forem infrequentes.
O custo de tentar novamente uma gravação for baixo para a aplicação.
Você estiver atualizando um item de cada vez.
- Use transações quando:
-
For necessário atualizar vários itens atomicamente.
Você precisar da semântica tudo ou nada em itens ou tabelas.
For necessário associar verificações de condição e gravações em uma única operação.
- Use o cliente de bloqueio quando:
-
For necessário coordenar o acesso a recursos externos em todos os processos distribuídos.
A seção essencial for de longa duração e tentar novamente em caso de conflito for caro.
Você precisar da expiração automática de bloqueio para lidar com as falhas do processo normalmente.
nota
Se você usa tabelas globais do DynamoDB, esteja ciente de que as tabelas globais usam uma estratégia de reconciliação do tipo “último gravador prevalece” para atualizações simultâneas. O bloqueio positivo com números de versão não funciona conforme o esperado em todas as regiões porque uma gravação em uma região pode sobrescrever uma gravação simultânea em outra região sem uma verificação de versão. Projete sua aplicação para lidar com conflitos em nível de aplicação ao usar tabelas globais.