3

ObjectifyDatanucleusTwigなどの GAE の既存の永続化フレームワークは、データストアの「結果整合性」の性質をどのように処理しますか?

レイヤー内のデータストアを使用していますDatastoreService(現在、そのような永続化フレームワークは使用していません)。

単体テスト中に、オブジェクトの正しい数を取得する場合と取得しない場合があります。これは予想されます。

これは私の JUnit ヘルパー構成です。

private final LocalServiceTestHelper helper =
    new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig()
        .setDefaultHighRepJobPolicyUnappliedJobPercentage(50)); 

ここで、put/get メソッドを再試行 (再試行回数 4) を伴う do-while ループに配置したとしても、エンティティの put/get に失敗します。

現時点で、これらの指定されたフレームワークについて、3 つのオブジェクトを配置すると 3 つのオブジェクトが取得されることを保証できましたか? もしそうなら、それはどのように実装されましたか?

私が考えることができる唯一のことは、Memcache を使用することです。つまり、私のメソッドは最初にそこからエンティティを取得しようとします。失敗した場合は、データストアをチェックするのはそのときだけです。これは健全なアプローチですか、それともより良いアプローチまたは正しいアプローチがありますか?

4

3 に答える 3

2

Objectify は、形や形を問わず、結果整合性を扱いません。開発者であるあなたは、Objectify やその他のライブラリを使用するときは、このことを念頭に置いておく必要があります。

クエリの do/while ループや、wait() の追加は、強い一貫性を保証するものではありません。せいぜい、最新の結果が得られる可能性を高めることができますが、確実とは言えません。

Memcache は、信頼性の低いストレージであるため、ここでも実際には何の保証も提供しません。memcache put() 関数が NO-OP であること、つまり何もしないことは完全に合法です。

中心的な問題に対処するには、強力な整合性を使用する方法でアプリを設計する必要があります。そのため、gets クエリや祖先クエリなどの強力な一貫性のあるデータストア読み取り操作を使用できます。または、HTTP 経由で一部のデータを渡すこともできます。

于 2013-04-21T08:00:29.510 に答える
2

クエリの強い一貫性が必要な場合は、次の 2 つの選択肢があります。

  1. ) 祖先 クエリを使用します。

  2. )クエリの代わりにデータストアの get 操作を使用してください。強い一貫性があります。

キー名を慎重に構成すれば、多くの場合、クエリの代わりに取得を使用できます。特定のユーザーに対してクエリを一貫して「表示」する必要がある場合の他の選択肢は、ちょっとしたトリックを適用することです。つまり、ユーザーの変更を結果に挿入します。そのため、名前が変更されてプロフィール ページにリダイレクトされた場合は、送信する前にその変更を結果に挿入します。

于 2013-04-21T17:34:22.233 に答える