157 votes

Quelle est la méthode recommandée pour supprimer un grand nombre d'éléments de DynamoDB ?

J'écris un simple service de journalisation dans DynamoDB.

J'ai une table de logs dont les clés sont un hash user_id et une plage de timestamp (Unix epoch int).

Lorsqu'un utilisateur du service résilie son compte, je dois supprimer tous les éléments du tableau, quelle que soit la valeur de l'intervalle.

Quelle est la méthode recommandée pour effectuer ce type d'opération (en gardant à l'esprit qu'il peut y avoir des millions d'éléments à supprimer) ?

Mes options, pour autant que je puisse en juger, sont les suivantes :

A : Effectuer une opération de balayage, en appelant la fonction de suppression pour chaque élément renvoyé, jusqu'à ce qu'il n'y ait plus d'éléments.

B : Effectuer une opération BatchGet, en appelant à nouveau la fonction delete pour chaque élément jusqu'à ce qu'il n'y en ait plus.

Ces deux solutions me semblent terribles car elles prendront beaucoup de temps.

Ce que je souhaite idéalement, c'est appeler LogTable.DeleteItem(user_id) - sans fournir la plage, et faire en sorte qu'il supprime tout pour moi.

78voto

Steffen Opel Points 31067

Ce que je veux idéalement faire, c'est appeler LogTable.D sans fournir l'intervalle, et qu'il supprime tout pour moi.

Je peux imaginer que des opérations avancées comme celles-ci seront ajoutées au fil du temps par l'équipe AWS (ils ont l'habitude de commencer par un ensemble limité de fonctionnalités et d'évaluer les extensions en fonction des commentaires des clients), mais voici ce que vous devriez faire pour éviter le coût d'une analyse complète au moins :

  1. Utilisation Demande de renseignements plutôt que Scanner pour récupérer tous les éléments pour user_id - cela fonctionne quelle que soit la clé primaire combinée hachage/gamme utilisée, car HashKeyValue y RangeKeyCondition sont des paramètres distincts dans cette API et le premier ne vise que l'élément Valeur de l'attribut de la composante de hachage de la clé primaire composite. .

    • Veuillez noter que vous devrez gérer la pagination de l''API de la requête comme d''habitude, voir l''article sur la pagination de l''API de la requête. ExclusiveStartKey paramètre :

      Clé primaire de l'élément à partir duquel poursuivre une requête antérieure. Une précédente peut fournir cette valeur a été interrompue avant la fin de la requête, soit en raison de la taille de l'ensemble de résultats, soit en raison de la taille de l'ensemble de résultats. en raison de la taille de l'ensemble des résultats ou du paramètre Limit. La clé LastEvaluatedKey peut être renvoyée dans une nouvelle requête l'opération à partir de ce point.

  2. Passez en revue tous les articles retournés et facilitez Supprimer un élément comme d'habitude

    • Mise à jour : Très probablement BatchWriteItem est plus approprié pour un cas d'utilisation comme celui-ci (voir ci-dessous pour plus de détails).

Mise à jour

Comme le souligne ivant , le BatchWriteItem fonctionnement vous permet de mettre ou supprimer plusieurs éléments dans plusieurs tables en un seul appel à l'API [c'est moi qui souligne] :

Pour télécharger un élément, vous pouvez utiliser l'API PutItem et pour en supprimer un élément, vous pouvez utiliser l'API DeleteItem. Cependant, lorsque vous souhaitez télécharger ou supprimer de grandes quantités de données, comme le téléchargement de grandes quantités de données données depuis Amazon Elastic MapReduce (EMR) ou migrer des données depuis une autre base de données vers Amazon DynamoDB, cette API offre une alternative efficace. efficace.

Il convient de noter que cette méthode présente encore des limites importantes, notamment en ce qui concerne l'accès à l'information et à la formation :

  • Nombre maximal d'opérations en une seule demande - Vous pouvez spécifier jusqu'à 25 opérations d'insertion ou de suppression au total ; toutefois, la taille totale de la requête ne peut pas dépasser 1 Mo (la charge utile HTTP).

  • Pas une opération atomique - Les opérations individuelles spécifiées dans un BatchWriteItem sont atomiques ; cependant, le BatchWriteItem dans son ensemble est une opération "best-effort" et non une opération atomique. En d'autres termes, dans une requête BatchWriteItem, certaines opérations peuvent réussir et d'autres échouer. [...]

Néanmoins, il est évident que cela représente un gain potentiel important pour des cas d'utilisation tels que celui qui nous occupe.

54voto

jonathan Points 662

D'après la documentation de DynamoDB, vous pouvez simplement supprimer la table complète.

Voir ci-dessous :

"La suppression d'une table entière est nettement plus efficace que la suppression d'éléments un par un, ce qui a pour effet de doubler le débit d'écriture puisque vous effectuez autant d'opérations de suppression que d'opérations d'enregistrement"

Si vous ne souhaitez supprimer qu'un sous-ensemble de vos données, vous pouvez créer des tableaux distincts pour chaque mois, année ou autre. De cette manière, vous pouvez supprimer le "dernier mois" et conserver le reste de vos données intactes.

Voici comment supprimer une table en Java à l'aide du SDK AWS :

DeleteTableRequest deleteTableRequest = new DeleteTableRequest()
  .withTableName(tableName);
DeleteTableResult result = client.deleteTable(deleteTableRequest);

24voto

Lukas Liesis Points 564

Si vous souhaitez supprimer des éléments après un certain temps, par exemple après un mois, il vous suffit d'utiliser l'option Durée de vie. Cette option permet de supprimer des éléments après un certain temps, par exemple après un mois. no compter les unités d'écriture.

Dans votre cas, j'ajouterais ttl lorsque les logs expirent et je laisserais ces ttl après la suppression d'un utilisateur. Le TTL permet de s'assurer que les logs sont supprimés à terme.

Lorsque l'option Time To Live est activée sur une table, un fond d'écran j TTL des éléments pour voir s'ils ont expiré.

DynamoDB supprime généralement les données expirées. l'expiration. La durée exacte pendant laquelle un élément est réellement supprimé après expiration dépend de la nature de la charge de travail et de la taille de l'onglet. taille de la table. Les éléments qui ont expiré et qui n'ont pas été supprimés seront apparaissent toujours dans les lectures, les requêtes et les balayages. Ces éléments peuvent toujours être Ces éléments peuvent toujours être mis à jour et les mises à jour réussies pour modifier ou supprimer l'attribut d'expiration seront honorées. seront honorées.

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/howitworks-ttl.html

7voto

Iman Sedighi Points 100

La réponse à cette question dépend du nombre d'articles, de leur taille et de votre budget. En fonction de cela, nous avons les 3 cas suivants :

1- Le nombre d'éléments et la taille des éléments dans la table ne sont pas très importants. Alors, comme l'a dit Steffen Opel, vous pouvez utiliser une requête plutôt qu'un balayage pour récupérer tous les éléments pour user_id, puis boucler sur tous les éléments retournés et faciliter soit l'accès à la base de données, soit l'accès à la base de données. DeleteItem o BatchWriteItem . Mais gardez à l'esprit que vous risquez de brûler une grande partie de la capacité de débit. Par exemple, considérons une situation où vous devez supprimer 1000 éléments d'une table DynamoDB. Supposons que chaque élément ait une taille de 1 Ko, ce qui représente environ 1 Mo de données. Cette tâche de suppression en masse nécessitera un total de 2000 unités de capacité d'écriture pour la requête et la suppression. Pour effectuer ce chargement de données en 10 secondes (ce qui n'est même pas considéré comme rapide dans certaines applications), vous devrez définir le débit d'écriture provisionné de la table à 200 unités de capacité d'écriture. Comme vous pouvez le constater, il est possible d'utiliser cette méthode pour un nombre réduit d'éléments ou pour des éléments de petite taille.

2- Nous avons beaucoup d'éléments ou des éléments très volumineux dans la table et nous pouvons les stocker en fonction de l'heure dans différentes tables. Ensuite, comme c'est beaucoup mieux mais je ne pense pas que cela corresponde à votre cas. Si vous voulez avoir une table séparée pour chaque utilisateur, je pense que si le nombre d'utilisateurs est élevé, c'est très coûteux et ce n'est pas pratique dans votre cas.

3- Si vous avez beaucoup de données et que vous ne pouvez pas diviser vos données chaudes et froides dans des tables différentes et que vous avez besoin d'effectuer des suppressions à grande échelle fréquemment, DynamoDB n'est malheureusement pas une bonne option pour vous. Il peut devenir plus cher ou très lent (en fonction de votre budget). Dans ce cas, je vous recommande de trouver une autre base de données pour vos données.

3voto

Shraavan Hebbar Points 179

Nous n'avons pas la possibilité de tronquer les tables Dynamo. Nous devons supprimer la table et la recréer. Les frais de DynamoDB sont basés sur les unités de capacité de lecture et les unités de capacité d'écriture. Si nous supprimons tous les éléments à l'aide de la fonction BatchWriteItem, cela utilisera WriteCapacityUnits. Il est donc préférable de supprimer des enregistrements spécifiques ou de supprimer la table et de recommencer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X