Ich schreibe einen einfachen Protokollierungsdienst in DynamoDB.
Ich habe eine Protokolltabelle, die von einem user_id-Hash und einem Zeitstempelbereich (Unix epoch int) verschlüsselt wird.
Wenn ein Benutzer des Dienstes sein Konto kündigt, muss ich alle Elemente in der Tabelle löschen, unabhängig vom Bereichswert.
Was ist die empfohlene Methode für diese Art von Operation (wenn Sie bedenken, dass möglicherweise Millionen von Elementen gelöscht werden müssen)?
Soweit ich sehen kann, sind meine Optionen:
A: Führen Sie einen Scanvorgang durch und rufen Sie bei jedem zurückgegebenen Artikel die Option "Löschen" auf, bis keine Artikel mehr übrig sind
B: Führen Sie eine BatchGet-Operation aus und rufen Sie erneut delete für jedes Element auf, bis keine mehr übrig sind
Beide sehen für mich schrecklich aus, da sie lange dauern werden.
Im Idealfall möchte ich LogTable.DeleteItem (user_id) aufrufen - ohne den Bereich anzugeben und alles für mich löschen zu lassen.
BatchWriteItem
Elementen muss überTableWriteItems
batch_writer()
als Teil derboto3.resource.Table
API, die "das Puffern und Senden von Elementen in Stapeln automatisch übernimmt. Außerdem wird der Stapelschreiber dies tun." Behandeln Sie auch unverarbeitete Elemente automatisch und senden Sie sie nach Bedarf erneut. "Das heißt, es ist ein Wrapper um BatchWriteItem, der die lästigen Teile verwaltet. boto3.amazonaws.com/v1/documentation/api/latest/reference/…Gemäß der DynamoDB-Dokumentation können Sie einfach die vollständige Tabelle löschen.
Siehe unten:
"Das Löschen einer gesamten Tabelle ist wesentlich effizienter als das Entfernen von Elementen nacheinander. Dadurch wird der Schreibdurchsatz im Wesentlichen verdoppelt, da Sie so viele Löschvorgänge wie Put-Vorgänge ausführen."
Wenn Sie nur eine Teilmenge Ihrer Daten löschen möchten, können Sie für jeden Monat, jedes Jahr oder ähnliches separate Tabellen erstellen. Auf diese Weise können Sie "letzten Monat" entfernen und den Rest Ihrer Daten intakt halten.
So löschen Sie eine Tabelle in Java mit dem AWS SDK:
quelle
Wenn Sie Elemente nach einiger Zeit löschen möchten, z. B. nach einem Monat, verwenden Sie einfach die Option Time To Live. Schreibeinheiten werden nicht gezählt.
In Ihrem Fall würde ich ttl hinzufügen, wenn Protokolle ablaufen, und diese belassen, nachdem ein Benutzer gelöscht wurde. TTL würde sicherstellen, dass Protokolle schließlich entfernt werden.
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/howitworks-ttl.html
quelle
Die Antwort auf diese Frage hängt von der Anzahl der Artikel und ihrer Größe sowie Ihrem Budget ab. Hängt davon ab, dass wir folgende 3 Fälle haben:
1- Die Anzahl der Elemente und die Größe der Elemente in der Tabelle sind nicht sehr hoch. dann können Sie, wie Steffen Opel sagte, Abfrage anstelle von Scannen verwenden, um alle Elemente für user_id abzurufen und dann alle zurückgegebenen Elemente zu durchlaufen und entweder
DeleteItem
oder zu erleichternBatchWriteItem
. Beachten Sie jedoch, dass hier möglicherweise viel Durchsatzkapazität verbraucht wird. Stellen Sie sich beispielsweise eine Situation vor, in der Sie 1000 Elemente aus einer DynamoDB-Tabelle löschen müssen. Angenommen, jedes Element hat eine Größe von 1 KB, was zu etwa 1 MB Daten führt. Für diese Massenlöschaufgabe sind insgesamt 2000 Schreibkapazitätseinheiten zum Abfragen und Löschen erforderlich. Um dieses Laden der Daten innerhalb von 10 Sekunden durchzuführen (was in einigen Anwendungen nicht einmal als schnell angesehen wird), müssten Sie den bereitgestellten Schreibdurchsatz der Tabelle auf 200 Schreibkapazitätseinheiten festlegen. Wie Sie sehen können, ist es machbar, diese Methode zu verwenden, wenn es sich um eine geringere Anzahl von Artikeln oder kleine Artikel handelt.2- Wir haben viele oder sehr große Gegenstände in der Tabelle und können sie je nach Zeit in verschiedenen Tabellen speichern. Dann können Sie, wie Jonathan sagte, einfach die Tabelle löschen. Das ist viel besser, aber ich denke nicht, dass es mit Ihrem Fall übereinstimmt. Da Sie alle Benutzerdaten unabhängig vom Zeitpunkt der Erstellung der Protokolle löschen möchten, können Sie in diesem Fall eine bestimmte Tabelle nicht löschen. Wenn Sie eine separate Tabelle für jeden Benutzer haben möchten, dann ist es wahrscheinlich so teuer und für Ihren Fall nicht praktikabel, wenn die Anzahl der Benutzer hoch ist.
3- Wenn Sie viele Daten haben und Ihre heißen und kalten Daten nicht in verschiedene Tabellen aufteilen können und häufig umfangreiche Löschvorgänge durchführen müssen, ist DynamoDB leider überhaupt keine gute Option für Sie. Es kann teurer oder sehr langsam werden (abhängig von Ihrem Budget). In diesen Fällen empfehle ich, eine andere Datenbank für Ihre Daten zu suchen.
quelle
Mein Ansatz zum Löschen aller Zeilen aus einer Tabelle in DynamoDb besteht darin, alle Zeilen mit DynamoDbs ScanAsync aus der Tabelle zu ziehen und die Ergebnisliste dann DynamoDbs AddDeleteItems zuzuführen. Der folgende Code in C # funktioniert gut für mich.
Hinweis: Das Löschen der Tabelle und das anschließende erneute Erstellen über die Webkonsole kann zu Problemen führen, wenn Sie YAML / CloudFront zum Erstellen der Tabelle verwenden.
quelle
Wir haben keine Möglichkeit, Dynamotabellen abzuschneiden. Wir müssen die Tabelle löschen und erneut erstellen. DynamoDB-Gebühren basieren auf ReadCapacityUnits und WriteCapacityUnits. Wenn wir alle Elemente mit der BatchWriteItem-Funktion löschen, wird WriteCapacityUnits verwendet. Um bestimmte Datensätze zu löschen oder die Tabelle zu löschen und erneut zu starten.
quelle