Query Cursors の AppEngine ドキュメントで次の段落に出くわしました。
カーソルの興味深いアプリケーションは、目に見えない変更についてエンティティを監視することです。アプリがエンティティが変更されるたびに現在の日付と時刻でタイムスタンプ プロパティを設定する場合、アプリはデータストア カーソルを使用して、タイムスタンプ プロパティで昇順に並べ替えられたクエリを使用して、エンティティが結果リストの最後に移動するタイミングを確認できます。 . エンティティのタイムスタンプが更新された場合、カーソルを含むクエリは更新されたエンティティを返します。クエリが最後に実行されてからエンティティが更新されていない場合、結果は返されず、カーソルは移動しません。
これが確実に機能するためには、異なるサーバー インスタンス間でのクロック同期について何らかの保証が必要です。そうしないと、次のシナリオが発生する可能性があります。
- サーバー インスタンス 1 (高速クロック) は、タイムスタンプ 1000 で更新を保存します。
- クライアントは更新を要求し、この 1 つの更新を見つけます。
- サーバー インスタンス 2 (遅いクロック) は、タイムスタンプ 950 で別の更新を保存します。
- クライアントが更新を要求しましたが、タイムスタンプが増加しなかったため、この更新が見つかりません。
私の知る限り、そのようなクロック同期の保証はありませんでした。これ変わった???
アップデート:
クロックが完全に同期されていたとしても、このアプローチではクエリの結果整合性が原因で結果が得られない可能性があることに気付きました。後の更新が前の更新の前にコミットされて同時クエリになり、前の更新がコミットされない場合、前の更新は非表示になります。または、何か不足していますか?