3

Basierend auf der Dokumentation für Objectify und Google Cloud Datastor, würde ich die Abfragen und die Batch-Lasten im folgenden Code erwartet parallel auszuführen:Warum werden meine Abfragen und der Stapel nicht parallel ausgeführt?

List<Iterable<Key<MyType>>> results = new ArrayList<>(); 
for (...) { 
    results.add(ofy().load() 
     .type(MyType.class) 
     .filter(...) 
     .keys() 
     .iterable()); 
} 
... 
Iterable<MyType> keys = ...; 
Collection<MyType> c = ofy().load().keys(keys).values(); 

Aber die Spur macht es wie jede Abfrage aussehen und jede Entität Last führt in Folge:

Trace

Was soll das?

Antwort

2

Es sieht so aus, als ob dies nur passiert, wenn man einen Cache von Memcache holt. Mit ähnlichem Code sehe ich das erwartete Asynchron-Verhalten für datastore_v3.Get/Put/Löschen:

datastore_v3.Get datastore_v3.Put datastore_v3.Delete

Sie den Grund dafür scheint ist, dass Objectify nicht AsyncMemcacheService nicht verwendet. In der Tat gibt es dafür eine open issue auf der Projektseite, und dies kann auch durch Auschecken der Quelle und Ausführen einer grep -r AsyncMemcacheService bestätigt werden.

In Bezug auf die seriellen datastore_v3.RunQuery Aufrufe, Aufrufe von ofy(). Load(). Type (...). Filter (...). Iterable() sind 'asynchron' in denen sie return immediately, jedoch die Aktuelle Datastore-Abfragen werden seriell als App Engine-Datastore-API doesn't expose an explicitly async API for queries ausgeführt.