1

私のGAE構造との強い一貫性を達成するために私が持っているこの計画を実行したいと思います。現在、これが私が持っているものです(それは本当に簡単です、私は約束します):

クラス (プログラミング「クラス」ではなくクラスを意味するクラス) モデルと割り当てモデル、およびユーザー モデルがあります。現在、クラスには、ユーザー ID のインデックス付きリストである memberIds と呼ばれる整数リスト プロパティがあります。クラスには、割り当て ID の文字列リストもあります。

新しい割り当てが作成されるたびに、それぞれのクラス エンティティも更新され、新しい割り当て ID がそのリストに追加されます。

私がやりたいことは、ユーザーの新しい割り当てを取得することです。私がしているのは、すべてのクラスのクエリmemberId = currentUserIdです。返される各クラスには、割り当て ID のリストがあります。これらの ID を使用して、それぞれの割り当てをキーで取得します。このデータ モデルを使用して数か月が経過した後、これ (クラス クエリの部分) との強い一貫性が得られない可能性があることに気付きました。

ユーザー A が課題を投稿すると (その結果、ClassA が更新されます)、新しい課題をチェックインしたユーザー B は、その直後に ClassA への更新された変更をまだ確認していない可能性があります (そうですか?)。

これは望ましくありません。解決策の 1 つは、ユーザーの祖先クエリを使用することですが、私の場合はそれが不可能であり、エンティティ グループは 1 秒あたり 1 回の書き込みに制限されており、それで十分かどうかはわかりません。

新しい課題が投稿されるたびに、私たちはこれを行います:

  • それぞれの Class エンティティを取得します
  • クラスに課題IDを追加する
  • このクラスのすべてのメンバーの ID を取得します
  • メンバーであるすべてのユーザーをキーで取得します
  • ユーザーエンティティには、ユーザーがメンバーであるクラスのリストがあります。(LocalStructuredProperty、辞書のようなもの:{"classId" : "242", "hasNewAssignment" : "Yes"} )。そのクラスにフラグを立てますhasNewAssignment = YES
  • ユーザーが新しい割り当てを取得したい場合、新しい割り当てがあり、私がメンバーであるグループを照会する代わりに、クラスのユーザーオブジェクトリストをチェックし、どのクラスに新しい割り当てがあるかを確認します。
  • これらのクラスをキーで取得します (これまでのところ強い一貫性がありますよね?)
  • クラスの割り当てリストを確認し、すべての割り当てをキーで取得します。

したがって、このプロセス全体を通して、私は一度も質問したことがありません。すべての結果は強い一貫性があるはずですよね? これは良い解決策ですか?私は物事を過度に複雑にしていますか?これにより、読み取り/書き込みコストが急増していますか? どう思いますか?

4

2 に答える 2

2

クエリは強整合性ではありません。Get は強整合性です。

あなたは正しいことをしたと思います:

  1. あなたのアクセスは強い一貫性があります。
  2. 読み取りは安くなります。1 つの get は、1 つのエンティティを返すクエリよりも半分安くなります。
  3. すべての User エンティティを更新する必要もあります。

したがって、コストは使用パターンによって異なります。つまり、割り当ての読み取りと新しい割り当ての作成の数です。

于 2012-10-22T04:56:09.480 に答える
0

祖先クエリを使用する方が良い解決策だと思います。

  • 割り当てエンティティの祖先を、割り当てが割り当てられるクラスとして設定します
  • Student エンティティの祖先を、学生が属する Class として設定します。

このようにして、特定のクラスのすべての課題と学生が同じエンティティ グループに属します。したがって、単一のクラスのみを処理する必要があるクエリに関して、強い整合性が保証されます。

注: 同時にクラスに課題を投稿しない人はあまりいないと思います。(ただし、異なるエンティティ グループに属しているため、何人でも課題を異なるクラスに投稿できます)

于 2015-02-17T10:09:24.520 に答える