A Amazon anunciou que seu serviço de banco de dados NoSQL DynamoDB agora suporta Transações, oferecendo garantias completas de atomicidade, consistência, isolamento e durabilidade (ACID). Com esse recurso, os desenvolvedores podem criar garantias de transação para atualizações de vários itens, facilitando a prevenção de conflitos e erros ao desenvolver aplicativos essenciais para negócios altamente escaláveis.
O DynamoDB da Amazon é um banco de dados de documentos e chave-valor disponível na AWS, oferecendo aos desenvolvedores um serviço de banco de dados NoSQL para "qualquer escala". Esse serviço de banco de dados é usado pelos clientes da AWS para vários casos de uso, desde a criação de microsserviços e back-ends móveis até a implementação de soluções de jogos e Internet das Coisas (IoT). Agora, a Amazon tem como objetivo tornar mais simples a vida de desenvolvedores que precisam utilizar uma lógica que envolva a utilização de múltiplas operações, com tudo ou nada, em uma ou mais tabelas com o suporte nativo para transações.
A Amazon apresentou duas novas operações do DynamoDB para lidar com transações:
- TransactWriteItems: uma operação em lote que contém um conjunto de gravação, com uma ou mais operações PutItem, UpdateItem e DeleteItem;
- TransactGetItems: uma operação em lote que contém um conjunto de leitura, com uma ou mais operações GetItem.
Cada transação pode incluir até 10 itens exclusivos ou até 4 MB de dados, incluindo condições. No fórum do hacker news, foi criado um tópico para discutir as transações do Amazon DynamoDB, e um entrevistado afirmou:
O limite máximo de 10 itens por transação, é uma restrição e tanto! Acredito que será necessário planejar todas as transações e se certificar de que elas atendem aos limites.
As transações do DynamoDB oferecem várias opções de leitura e gravação:
- Três opções para leituras - consistência eventual, consistência forte e transacional;
- Dois para gravações - padrão e transacional.
No post do blog sobre Transação, Danilo Poccia, evangelista da Amazon Web Services, fornece um exemplo - implementando uma única transação atômica ao comprar um item:
- Primeiro, verifique se o item está disponível e o usuário tem o dinheiro necessário;
- Se essas condições forem satisfeitas, o item será marcado como não disponível e de propriedade do usuário;
- O item comprado é então adicionado à lista de inventário do usuário.
data = await dynamoDb.transactWriteItems({
TransactItems: [
{
Update: {
TableName: 'items',
Key: { id: { S: itemId } },
ConditionExpression: 'available = :true',
UpdateExpression: 'set available = :false, ' +
'ownedBy = :player',
ExpressionAttributeValues: {
':true': { BOOL: true },
':false': { BOOL: false },
':player': { S: playerId }
}
}
},
{
Update: {
TableName: 'players',
Key: { id: { S: playerId } },
ConditionExpression: 'coins >= :price',
UpdateExpression: 'set coins = coins - :price, ' +
'inventory = list_append(inventory, :items)',
ExpressionAttributeValues: {
':items': { L: [{ S: itemId }] },
':price': { N: itemPrice.toString() }
}
}
}
]
}).promise();
Com o suporte de transações, Poccia também declara no post em seu blog que as transações trarão os benefícios de escala, desempenho corporativos do DynamoDB para um conjunto mais amplo de cargas de trabalho. Muitos casos de uso são mais fáceis e rápidos de implementar usando transações, por exemplo:
- Processando transações financeiras;
- Cumprindo e gerenciando pedidos;
- Construindo mecanismos de jogo multiplayer;
- Coordenação de ações em componentes e serviços distribuídos.
Dennis Vriend, consultor de nuvem da binx.io, concluiu em seu blog:
Por suportar ACID, o DynamoDB pode ser usado para manter duas ou mais tabelas de regiões consistentes e abrir caminho para novas arquiteturas de dados em escala de nuvem.
Por fim, as transações do DynamoDB estão disponíveis globalmente em todas as regiões comerciais. Além disso, não haverá custo adicional para permitir transações para as tabelas do DynamoDB - os clientes só pagarão pelas leituras ou gravações que fazem parte de suas transações.