Macht die automatische Verwendung des Caching in NDB, der Google App Engine-Datastore-Bibliothek für Python, das Transaktionsmodell ungültig?

8

Ein wichtiges Verkaufsargument von Google Cloud Datastore ist, dass es innerhalb eines Entitätsgruppe.

  

Cloud Datastore stellt sicher, dass Entitätssuchen nach Schlüssel- und Vorfahrenabfragen immer stark konsistente Daten erhalten.

     

[Datenspeicher ist gut für] Transaktionen, die auf ACID-Eigenschaften basieren, z. B. Geld von einem Bankkonto auf ein anderes übertragen.

Die NDB-Bibliothek ist der dokumentierte Weg, auf den Datastore von Google App Engine zuzugreifen Python.

Die NDB-Bibliothek verwendet jedoch standardmäßig das Caching , um die Ergebnisse zu beschleunigen. Die verwendeten Caches sind ein "In-Context-Cache" und Memcache . Aber keiner dieser Caches kann transaktional mit dem Datenspeicher aktualisiert werden. Es scheint also, dass wichtige Konsistenzeigenschaften aufgegeben werden müssen (Hervorhebung von mir):

  

Wenn die Transaktion festgeschrieben wird, versucht ihr Kontext , alle derartigen Entitäten aus Memcache zu löschen. Beachten Sie jedoch, dass einige Fehler diese Löschvorgänge möglicherweise verhindern.

Ist mein Verständnis davon korrekt? Das heißt, wenn die NDB-Bibliothek in der Standardkonfiguration verwendet wird, gibt es keine Konsistenzgarantie für den Zugriff selbst innerhalb einer Entitätsgruppe?

Wenn ich recht habe, ist das ein großes Problem.

Es opfert ziemlich viel die größte Eigenschaft des Datenspeichers. All diese Dokumentation über Konsistenz- und ACID-Transaktionen. In Google IO wird darüber gesprochen, wie Entitätsgruppen verwendet werden, um Konsistenz zu erzielen. Sogar Forschungsberichte. Und leise, in einer kleinen Ecke der Dokumentation, in den beiläufigsten Sätzen, lerne ich, dass ich diese Eigenschaften nicht in der Standardkonfiguration bekomme.

Das ist unglaublich irreführend. Ich bin sicher, die meisten Leute haben das nicht gesehen. Die meisten Implementierungen erwarten wahrscheinlich ACID-Transaktionen innerhalb von Entitätsgruppen, erhalten diese jedoch nicht. Dies sind schwerwiegende Fehler im Produktionscode.

Dies ist ein großer Fehler bei der Implementierung und Dokumentation. Der Standardwert sollte niemals die Konsistenz für die Geschwindigkeit beeinträchtigt haben. Konsistenz war der Kernpunkt von Unternehmensgruppen. Und wenn die Implementierung diese unerwartete Sache getan hat, die die Semantik so dramatisch verändert, dann hätte die Dokumentation es ohrenbetäubend klar machen müssen.

    
user2771609 11.07.2017, 20:08
quelle

1 Antwort

2

Soweit ich weiß, wenn Sie Entitäten mit Transaktionen bekommen, wird der Cache nicht benutzt, so dass Sie bei Datenänderungen OK sind.

Direkte Datastore-Lesevorgänge nach Schlüssel sind konsistent. Wenn Sie also stark konsistente Ergebnisse für Lesevorgänge erhalten möchten, müssen Sie den DBB-Cache bei Bedarf deaktivieren. Andernfalls erhalten Sie eine mögliche Konsistenz, z. wenn die Cache-Invalidierung erfolgreich ist oder der Cache abläuft / gelöscht wird.

Sie können auch manuell Elemente aus dem Cache entfernen, nachdem die Transaktion mit ndb.delete() und _use_datastore=False abgeschlossen wurde, um sicherzustellen, dass der Cache sauber ist.

    
Alexander Trakhimenok 19.07.2017 13:44
quelle