Estou escrevendo um serviço de registro simples no DynamoDB.
Eu tenho uma tabela de logs que é codificada por um hash user_id e um intervalo de carimbo de data / hora (Unix epoch int).
Quando um usuário do serviço encerra sua conta, preciso deletar todos os itens da tabela, independente do valor do intervalo.
Qual é a maneira recomendada de fazer esse tipo de operação (lembre-se de que pode haver milhões de itens a serem excluídos)?
Minhas opções, tanto quanto posso ver são:
R: Execute uma operação de digitalização, chamando delete em cada item devolvido, até que nenhum item seja deixado
B: Execute uma operação BatchGet, novamente chamando delete em cada item até que nenhum seja deixado
Ambos parecem terríveis para mim, pois levarão muito tempo.
O que eu idealmente quero fazer é chamar LogTable.DeleteItem (user_id) - Sem fornecer o intervalo, e fazer com que ele exclua tudo para mim.
BatchWriteItem
itens precisam ser especificados viaTableWriteItems
batch_writer()
como parte daboto3.resource.Table
API que "tratará automaticamente o armazenamento em buffer e o envio de itens em lotes. Além disso, o criador de lotes irá também manipula automaticamente quaisquer itens não processados e os reenvia conforme necessário ", ou seja, é um invólucro em torno do BatchWriteItem que gerencia as partes irritantes. boto3.amazonaws.com/v1/documentation/api/latest/reference/…De acordo com a documentação do DynamoDB, você pode simplesmente deletar a tabela inteira.
Ver abaixo:
"Excluir uma tabela inteira é significativamente mais eficiente do que remover itens um por um, o que essencialmente duplica a capacidade de gravação, pois você faz tantas operações de exclusão quanto de colocação"
Se você deseja excluir apenas um subconjunto de seus dados, você pode fazer tabelas separadas para cada mês, ano ou similar. Desta forma, você pode remover o "mês passado" e manter o resto de seus dados intactos.
É assim que você exclui uma tabela em Java usando o SDK da AWS:
fonte
Se você deseja excluir itens após algum tempo, por exemplo, após um mês, basta usar a opção Time To Live. Ele vai não contar unidades de gravação.
No seu caso, eu adicionaria ttl quando os logs expiram e os deixaria depois que um usuário fosse excluído. O TTL garantiria que os logs fossem removidos eventualmente.
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/howitworks-ttl.html
fonte
A resposta a esta pergunta depende do número de itens e seu tamanho e seu orçamento. Depende disso, temos os seguintes 3 casos:
1- O número de itens e o tamanho dos itens na tabela não são muito. então, como Steffen Opel disse, você pode usar Query em vez de Scan para recuperar todos os itens para user_id e, em seguida, fazer um loop em todos os itens devolvidos e facilitar
DeleteItem
ouBatchWriteItem
. Mas tenha em mente que você pode queimar muita capacidade de processamento aqui. Por exemplo, considere uma situação em que você precisa excluir 1000 itens de uma tabela do DynamoDB. Suponha que cada item tenha 1 KB de tamanho, resultando em cerca de 1 MB de dados. Essa tarefa de exclusão em massa exigirá um total de 2.000 unidades de capacidade de gravação para consulta e exclusão. Para executar esse carregamento de dados em 10 segundos (o que nem mesmo é considerado tão rápido em alguns aplicativos), você precisaria definir a taxa de transferência de gravação provisionada da tabela para 200 unidades de capacidade de gravação. Como você pode ver, é possível usar desta forma se for para menos número de itens ou itens de tamanho pequeno.2- Temos muitos itens ou itens muito grandes na mesa e podemos armazená-los de acordo com o tempo em diferentes tabelas. Então, como Jonathan Said, você pode simplesmente deletar a tabela. isso é muito melhor, mas não acho que corresponda ao seu caso. Como você deseja deletar todos os dados dos usuários não importa qual seja o momento de criação dos logs, então neste caso você não pode deletar uma determinada tabela. se você quiser ter uma mesa separada para cada usuário, então eu acho que se o número de usuários for alto, é muito caro e não é prático para o seu caso.
3- Se você tem muitos dados e não consegue dividir seus dados quentes e frios em tabelas diferentes e precisa deletar em grande escala com frequência, infelizmente o DynamoDB não é uma boa opção para você. Pode ficar mais caro ou muito lento (depende do seu orçamento). Nestes casos, recomendo encontrar outro banco de dados para seus dados.
fonte
Minha abordagem para excluir todas as linhas de uma tabela i DynamoDb é apenas puxar todas as linhas da tabela, usando DynamoDbs ScanAsync e, em seguida, alimentar a lista de resultados para DynamoDbs AddDeleteItems. O código abaixo em C # funciona bem para mim.
Nota: Excluir a tabela e, em seguida, recriá-la novamente do console da web pode causar problemas se usar YAML / CloudFront para criar a tabela.
fonte
Não temos a opção de truncar tabelas de dínamo. temos que largar a mesa e criar novamente. As cobranças do DynamoDB são baseadas em ReadCapacityUnits e WriteCapacityUnits. Se excluirmos todos os itens usando a função BatchWriteItem, ele usará WriteCapacityUnits. Portanto, é melhor excluir registros específicos ou excluir a tabela e começar novamente.
fonte