2016-05-17 15 views
3

In DynamoDB ein Atomic Counter ist eine Zahl, die Bedingungen RennenDynamoDB Atom Zähler für Kontostand

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithItems.html#WorkingWithItems.AtomicCounters

Was für eine Zahl atomarer macht vermeidet, und ich kann hinzufügen/subtrahieren von einem Schwimmer in Nicht-Einheitswerte ?

Zur Zeit mache ich: "SET Balance = Balance +: change"

(lange Version) Ich versuche DynamoDB für Benutzerguthaben zu verwenden, so Genauigkeit ist von größter Bedeutung. Die Waage kann gleichzeitig von mehreren Quellen aktualisiert werden. Es ist nicht notwendig, das Guthaben vorab abzurufen, wir werden niemals eine Transaktion ablehnen, ich sorge mich nur darum, dass wir, wenn alle Operationen beendet sind, das richtige Gleichgewicht haben. Die Operationen können auch in beliebiger Reihenfolge angewendet werden, solange das Endergebnis korrekt ist.

Von dem, was ich verstehe, sollte dies in Ordnung sein, aber ich habe keine Atomschritt Beispiele gesehen, die als „1“ Änderungen der Werte anderer tun entsteht

Meine Bedenken, weil Fragen wie Amazon DynamoDB Conditional Writes and Atomic Counters bedingte schreibt für die Verwendung empfehlen ähnliche Situation, die wie eine schreckliche Idee klingt. Wenn ich den Kontostand abrufe, ändere und einen bedingten Schreibvorgang ausführe, könnte der Schreibvorgang fehlschlagen, wenn sich der Wert in der Zwischenzeit geändert hat. Allerdings Balance ist die Definition von unternehmenskritischen, und ich bin immer nervös, wenn Dokumentation ignorieren

-zusätzliche Info-

Alle Schreib aus einer Lambda-Funktion stammen, und ich erwarte, dass so ziemlich 100% im Falsch schreibt. Ich führe jedoch auch eine Historie aller Änderungen und, falls sich das Guthaben in einem "unbekannten" Zustand befindet (z. B. Netzwerk-Timeout), könnte die Tabelle gesperrt und die korrekte Bilanz aus dem Verlauf neu berechnet werden.

Dies ist meiner Meinung nach die beste "normale" Operation. 99,999% der Zeit funktionieren alle Updates mit einem einzigen Schreibvorgang. Das Scheitern könnte sehr kostspielig sein, da wir den gesamten Verlauf eines Kunden scannen müssen, um das Gleichgewicht wieder herzustellen, aber im Hinblick auf den Trade-off scheint das eine ziemlich sichere Wette zu sein.

Antwort

0

Es scheint, dass dieses Konzept praktikabel ist, von einem AWS Personal Antwort

Oft Anwendung Autoren eine Kombination beider Ansätze nutzen, wo Sie haben ein atomarer Zähler für die Echtzeitzählung und eine Audit-Tabelle für die spätere perfekte Abrechnung.

https://forums.aws.amazon.com/thread.jspa?messageID=470243&#470243

Es gibt auch eine Bestätigung, dass das Update atomar sein wird und jeder Aktualisierungsvorgang wird konsequent

Alle nicht Batch-Anfragen Sie bei DynamoDB senden wird atomar verarbeitet - es gibt keine Verschachtelung jeglicher Art zwischen Anfragen.Schreibanforderungen sind ebenfalls konsistent, so dass jede Schreibanforderung die neueste Version des Elements zum Zeitpunkt des Empfangs der Anfrage aktualisiert.

https://forums.aws.amazon.com/thread.jspa?messageID=621994&#621994

In der Tat schreibt jeder auf ein bestimmtes Element

in DynamoDB, alle Operationen gegen ein bestimmtes Element serialisiert stark konsistent ist.

https://forums.aws.amazon.com/thread.jspa?messageID=324353&#324353

1

Die Dokumentation für Atomzähler ist ziemlich klar und meiner Meinung nach wird es für Ihren Anwendungsfall nicht sicher sein.

Das Problem, das Sie lösen, ist ziemlich häufig. AWS empfiehlt, in solchen Szenarien optimistisches Sperren zu verwenden. Bitte beachten Sie die folgenden AWS-Dokumentation, http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html

+0

All diese Dokumente sind sicher, dass Änderungen auf der Grundlage der richtigen clientseitige Version einer Anzahl hergestellt werden. Ich erhalte nie "Balance", also besteht keine Gefahr für eine veraltete Version. – FrozenKiwi

+0

Wenn der Aktualisierungsvorgang keine Konsistenz gewährleistet, sehe ich einfach keine Möglichkeit, eine korrekte Nummer zu garantieren, unabhängig davon, welche Methode ich verwende. Für einen bedingten Schreibvorgang schreiben wir IFF, die gespeicherte Zahl stimmt mit unserer erwarteten Anfangsbedingung überein. Wenn die Aktualisierung jedoch nicht konsistent ist, ist es möglich, dass der IFF-Test bestanden wird (Init-Wert stimmt überein), ein externer Prozess ändert den Wert , dann schreiben wir über die Änderung mit unserem Wert – FrozenKiwi

+0

Um es anders auszudrücken, wenn eine Zahl ein "Atomic Counter" ist, wenn "Update" -Operationen durchgeführt werden, dann funktioniert entweder der Use Case, oder Atomic Counters konnten die Erwartungen nicht erfüllen. Wenn ein Atomic Counter ein spezieller Zahlentyp ist oder nur Funktionen funktionieren, wenn er um "1" erhöht wird, zählen meine Operationen nicht als atomar und ich bin poched :) – FrozenKiwi