Datenkonsistenz in Datastore-Abfragen

Datenkonsistenzebenen

Die Ergebnisse von Datenspeicherabfragen können mit einer von zwei Konsistenzebenen bereitgestellt werden:

  • Strikt konsistente Abfragen (Strong Consistency) garantieren die aktuellsten Ergebnisse, ihre Verarbeitung kann jedoch länger dauern.
  • Abfragen mit Eventual Consistency werden im Allgemeinen schneller ausgeführt, können jedoch gelegentlich veraltete Ergebnisse zurückgeben.

Bei einer Abfrage mit Eventual Consistency wird auf die Indexe, von denen die Ergebnisse abgerufen werden, ebenfalls mit Eventual Consistency zugegriffen. Folglich geben solche Abfragen manchmal Entitäten zurück, die nicht mehr den ursprünglichen Abfragekriterien entsprechen, während Abfragen mit Strong Consistency immer konsistent sind.

Datenkonsistenz in Datastore-Abfragen

Die Ergebnisse von Abfragen werden je nach Art der Abfrage mit unterschiedlichen Konsistenzgarantieebenen zurückgegeben:

  • Ancestor-Abfragen sind Abfragen innerhalb einer Entitätengruppe und standardmäßig strikt konsistent. Sie können jedoch durch Anpassung der Leserichtlinien für Datastore zu Eventual Consistency-Abfragen werden (siehe unten).
  • Nicht-Ancestor-Abfragen sind immer Eventual-Consistency-Abfragen.

Der Abruf einer Entität nach Schlüssel, auch „Suche nach Schlüssel“ genannt, ist stark konsistent.

Leserichtlinie für Datastore einrichten

Zur Verbesserung der Leistung können Sie die Leserichtlinien für Datastore so festlegen, dass alle Lesevorgänge und Abfragen mit Eventual Consistency ausgeführt werden. (Mit der API können Sie auch explizit eine Richtlinie für strikte Konsistenz festlegen. Diese Einstellung hat jedoch keine praktischen Auswirkungen, weil Nicht-Ancestor-Abfragen ungeachtet der Richtlinie immer mit Eventual Consistency ausgeführt werden.)

Sie können auch ein Zeitlimit für Aufrufe in Datastore festlegen. Dies ist die maximale Zeit in Sekunden, die die Anwendung wartet, bis Datastore ein Ergebnis zurückgibt, bevor sie mit einem Fehler abbricht. Das Zeitlimit beträgt normalerweise 60 Sekunden. Höhere Werte sind derzeit nicht möglich. Sie können das Limit jedoch verkürzen und so dafür sorgen, dass ein bestimmter Vorgang schnell fehlschlägt (z. B. damit der Nutzer eine schnellere Antwort erhält).

Wenn Sie die Datastore-Leserichtlinien in Java festlegen möchten, erstellen Sie eine Datastore-Dienstkonfiguration (DatastoreServiceConfig) mit der verschachtelten Hilfsklasse DatastoreServiceConfig.Builder und übergeben Sie ihr eine Instanz der Klasse ReadPolicy. Im folgenden Beispiel wird gezeigt, wie Sie die Leserichtlinien, das Zeitlimit für den Aufruf oder beides festlegen:

double deadline = 5.0;

// Construct a read policy for eventual consistency
ReadPolicy policy = new ReadPolicy(ReadPolicy.Consistency.EVENTUAL);

// Set the read policy
DatastoreServiceConfig eventuallyConsistentConfig =
    DatastoreServiceConfig.Builder.withReadPolicy(policy);

// Set the call deadline
DatastoreServiceConfig deadlineConfig = DatastoreServiceConfig.Builder.withDeadline(deadline);

// Set both the read policy and the call deadline
DatastoreServiceConfig datastoreConfig =
    DatastoreServiceConfig.Builder.withReadPolicy(policy).deadline(deadline);

// Get Datastore service with the given configuration
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(datastoreConfig);

Nächste Schritte