2012-02-13 10 views
5

私はエンティティグループの1000を更新する長い実行ジョブを持っています。後で2回目の仕事を始めたいのですが、それらのアイテムがすべて更新されたと仮定する必要があります。非常に多くのエンティティグループが存在するため、トランザクションではできません。そのため、タスクキューを使用して1回目の完了後15分後に2番目のジョブを実行するようにスケジュールしました。Google AppEngine HRDデータストアの更新が完了したことを知る方法を教えてください。

良い方法がありますか?

データストアが以前のコールと同期していることを約束する15分と仮定することも、安全ですか?

私は高い複製を使用しています。

HRDについてのGoogle IOの動画では、最終的な一貫性に対処する方法のリストを示します。そのうちの1つは「それを受け入れる」ことでした。一部のアップデート(ツイッター投稿など)は、次回の読み込みと一貫性がある必要はありません。しかし、彼らはまた、 "ねえ、私たちは一貫している前に数ミリ秒の話をしています"と言った。その時間枠はどこに文書化されていますか?もう一度読む前に書いてから1分待つと、私の前書きがすべて読まれていることを意味すると思いますか?

ことの言及は、このビデオで39:30のマークでhttp://www.youtube.com/watch?feature=player_embedded&v=xO015C3R6dw

+0

私は以下に部分的な答えを示しましたが、正確に何をしようとしているかについてさらに情報を与えることができますか? – mjaggard

+0

基本的に私は1000個のエンティティを挿入または更新しています。その仕事が完了したら、アイテムにランクを適用する必要があります。だから私は、すべてのレコードを選択し、フィールドで注文するクエリを実行し、私はランキングについて心配しています。次に、別のエンティティタイプのランクを更新します。エンティティがクエリにない場合、そのランクは明らかにオフになります。 – user963263

答えて

0

私はこの文を見つけた:

結果整合性では、あなたの書き込みの99.9%以上は、数秒以内にクエリのために用意されています。このページの下部にある

http://code.google.com/appengine/docs/java/datastore/hr/overview.html

だから、私のアプリケーションのために、それは次の読み取りにそこにいるではない0.1%の確率では、おそらくOKです。ただし、祖先クエリを利用するためにスキーマを再設計する予定です。

0

である私は、更新が行われているかどうかを判断する方法で構築された任意のはないと思います。あなたのエンティティにlastUpdatedフィールドを追加し、最初の仕事で更新することをお勧めします。実行する前に2ndで更新しているエンティティのタイムスタンプをチェックしてください。

誰かがより良い解決策を持っているかどうかを確認してください。あなたが望むようなもの;-)

0

これは、一貫性をEventualに変更せずにエンティティを取得している限り、自動的です。 HRDは、関連するデータストアサーバーの大半にデータを戻してから戻します。非同期バージョンのputを呼び出す場合は、完了する前にすべてのFutureオブジェクトでgetメソッドを呼び出す必要があります。

最初のジョブの項目をクエリしている場合は、インデックスが更新されたかどうかを確認する方法がありません。ですから、例えば

...

あなたは、その種類のすべてのエンティティを取得し、すべてのエンティティのプロパティを更新する(ただし、任意のエンティティを作成していない)している場合。キーのみの照会に続いてバッチget(通常の照会とほぼ同じくらい速い/安い)を行い、すべての更新が適用されていることを確認します。

一方、新しいエンティティを追加したり、2番目のプロセスが照会する最初のプロセスでプロパティを更新する場合は、確かな方法はありません。

+0

私の最初のプロセスは、新しいエンティティを更新して作成します.2番目のプロセスを実行するのにどれだけ時間がかかっても、データストアから同じアイテムを読み込むために即時呼び出しでエンティティが存在することを確かめる方法はありません(15分または15日間)? – user963263

+0

それはあなたが "読む"ことによって何を意味するかによって異なります - あなたが "取得"を意味するならば、はい、それらは常にそこにあります。しかし、あなたが "クエリ"または "見つける"を意味するならば、いいえ。ただし、追加した各エンティティに対してキーのみのクエリを実行できます。追加されたエンティティがクエリ結果に存在するたびに2回目のプロセスを実行できるようにします。 – mjaggard

+0

アイテムの存続または更新を意味し、そのキーをメモリに保持します。次に、クエリを介してそれらを読み取ったときに、すべてのキーが結果に存在することを確認しますか?それらが存在する場合、データは数秒前に更新された更新と同期することが保証されていますか? それが有効なアプローチであっても、ある時点で私の1,000人は1,000,000人になります。私はその多くのデータを記憶に残したくありません。今はカーソルを使用して、一度に数100個のアイテムのみを操作することで回避しています。 – user963263

関連する問題