祖先クエリなしで高レプリケーションデータストアを使用した結果、結果整合性の問題が発生しているようです。強一貫性のためのデータの構造化から(強調が追加されました):
Google App Engineの高レプリケーションデータストア(HRD)は、複数のデータセンターにデータを同期的に保存することで、読み取りと書き込みの高可用性を提供します。ただし、書き込みがコミットされてからすべてのデータセンターに表示されるまでの遅延は、複数のエンティティグループにまたがるクエリ(祖先以外のクエリ)が結果整合性のある結果しか保証できないことを意味します。その結果、そのようなクエリの結果は、基になるデータへの最近の変更を反映できない場合があります。
一貫性の高いクエリ結果を取得するには、結果を単一のエンティティグループに制限する祖先クエリを使用する必要があります。これが機能するのは、エンティティグループが一貫性とトランザクション性の単位であるためです。すべてのデータ操作はグループ全体に適用されます。祖先クエリは、エンティティグループ全体が最新になるまで結果を返しません。アプリケーションが特定のクエリで非常に一貫性のある結果に依存している場合は、データモデルを設計するときにこれを考慮する必要があります。このページでは、強一貫性をサポートするようにデータを構造化するためのベストプラクティスについて説明します。
そのドキュメントの祖先クエリを使用して書き込みを行う例を次に示します。
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
String guestbookName = req.getParameter("guestbookName");
Key guestbookKey = KeyFactory.createKey("Guestbook", guestbookName);
String content = req.getParameter("content");
Date date = new Date();
// Place greeting in same entity group as guestbook
Entity greeting = new Entity("Greeting", guestbookKey);
greeting.setProperty("user", user);
greeting.setProperty("date", date);
greeting.setProperty("content", content);
そして読んで:
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Key guestbookKey = KeyFactory.createKey("Guestbook", guestbookName);
Query query = new Query("Greeting", guestbookKey)
.setAncestor(guestbookKey)
.addSort("date", Query.SortDirection.DESCENDING);
List<Entity> greetings = datastore.prepare(query)
.asList(FetchOptions.Builder.withLimit(10));
祖先クエリを使用する際の警告については、ドキュメントで詳しく説明しています。