J'écris un service de journalisation simple dans DynamoDB.
J'ai une table de journaux qui est saisie par un hachage user_id et une plage d'horodatage (Unix epoch int).
Lorsqu'un utilisateur du service met fin à son compte, je dois supprimer tous les éléments du tableau, quelle que soit la valeur de la plage.
Quelle est la méthode recommandée pour effectuer ce type d'opération (en gardant à l'esprit qu'il pourrait y avoir des millions d'éléments à supprimer)?
Mes options, d'après ce que je peux voir, sont:
R: Effectuez une opération de numérisation, appelant la suppression sur chaque élément retourné, jusqu'à ce qu'il ne reste plus d'éléments
B: Effectuez une opération BatchGet, en appelant à nouveau delete sur chaque élément jusqu'à ce qu'il n'en reste plus
Ces deux éléments me semblent terribles car ils prendront beaucoup de temps.
Ce que je veux idéalement faire est d'appeler LogTable.DeleteItem (user_id) - Sans fournir la plage, et faites-le tout supprimer pour moi.
BatchWriteItem
éléments doivent être spécifiés viaTableWriteItems
batch_writer()
dans l'boto3.resource.Table
API qui "gérera automatiquement la mise en mémoire tampon et l'envoi d'éléments par lots. De plus, le rédacteur de lots va gérer automatiquement tous les éléments non traités et les renvoyer si nécessaire "c'est-à-dire que c'est un wrapper autour de BatchWriteItem qui gère les parties ennuyeuses. boto3.amazonaws.com/v1/documentation/api/latest/reference/…Selon la documentation DynamoDB, vous pouvez simplement supprimer la table complète.
Voir ci-dessous:
"La suppression d'une table entière est beaucoup plus efficace que la suppression des éléments un par un, ce qui double essentiellement le débit d'écriture car vous effectuez autant d'opérations de suppression que d'opérations put"
Si vous souhaitez supprimer uniquement un sous-ensemble de vos données, vous pouvez créer des tableaux séparés pour chaque mois, année ou similaire. De cette façon, vous pouvez supprimer "le mois dernier" et conserver le reste de vos données intactes.
Voici comment supprimer une table en Java à l'aide du kit AWS SDK:
la source
Si vous souhaitez supprimer des éléments après un certain temps, par exemple après un mois, utilisez simplement l'option Time To Live. Il ne comptera pas les unités d'écriture.
Dans votre cas, j'ajouterais ttl lorsque les journaux expirent et je les laisserais après la suppression d'un utilisateur. TTL s'assurerait que les journaux sont finalement supprimés.
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/howitworks-ttl.html
la source
La réponse à cette question dépend du nombre d'articles et de leur taille et de votre budget. Cela dépend de cela, nous avons 3 cas suivants:
1- Le nombre d'articles et la taille des articles dans le tableau ne sont pas beaucoup. Ensuite, comme Steffen Opel l'a dit, vous pouvez utiliser la requête plutôt que le scan pour récupérer tous les éléments pour user_id, puis parcourir tous les éléments retournés et faciliter
DeleteItem
ouBatchWriteItem
. Mais gardez à l'esprit que vous risquez de brûler beaucoup de capacité de débit ici. Par exemple, considérez une situation où vous devez supprimer 1 000 éléments d'une table DynamoDB. Supposons que chaque élément a une taille de 1 Ko, ce qui entraîne environ 1 Mo de données. Cette tâche de suppression en bloc nécessitera un total de 2000 unités de capacité d'écriture pour l'interrogation et la suppression. Pour effectuer ce chargement de données dans les 10 secondes (ce qui n'est même pas considéré comme rapide dans certaines applications), vous devez définir le débit d'écriture provisionné de la table sur 200 unités de capacité d'écriture. Comme vous pouvez le voir, il est possible d'utiliser cette méthode si c'est pour moins d'articles ou des articles de petite taille.2- Nous avons beaucoup d'articles ou de très gros articles dans la table et nous pouvons les stocker en fonction du temps dans différentes tables. Ensuite, comme Jonathan l'a dit, vous pouvez simplement supprimer la table. c'est beaucoup mieux mais je ne pense pas que cela corresponde à votre cas. Comme vous souhaitez supprimer toutes les données des utilisateurs quelle que soit l'heure de création des journaux, dans ce cas, vous ne pouvez pas supprimer une table particulière. si vous voulez avoir une table séparée pour chaque utilisateur, je suppose que si le nombre d'utilisateurs est élevé, c'est tellement cher et ce n'est pas pratique pour votre cas.
3- Si vous avez beaucoup de données et que vous ne pouvez pas diviser vos données chaudes et froides en différentes tables et que vous devez faire des suppressions à grande échelle fréquemment, malheureusement DynamoDB n'est pas du tout une bonne option pour vous. Cela peut devenir plus cher ou très lent (dépend de votre budget). Dans ces cas, je recommande de trouver une autre base de données pour vos données.
la source
Mon approche pour supprimer toutes les lignes d'une table i DynamoDb consiste simplement à extraire toutes les lignes de la table, à l'aide de DynamoDbs ScanAsync, puis à transmettre la liste de résultats à DynamoDbs AddDeleteItems. Le code ci-dessous en C # fonctionne très bien pour moi.
Remarque: la suppression de la table puis sa recréation à partir de la console Web peut entraîner des problèmes si vous utilisez YAML / CloudFront pour créer la table.
la source
Nous n'avons pas la possibilité de tronquer les tables dynamo. nous devons laisser tomber la table et créer à nouveau. Les frais DynamoDB sont basés sur ReadCapacityUnits et WriteCapacityUnits. Si nous supprimons tous les éléments à l'aide de la fonction BatchWriteItem, il utilisera WriteCapacityUnits.Il est donc préférable de supprimer des enregistrements spécifiques ou de supprimer la table et de recommencer.
la source