1

In may app, I have the following process:

  1. Get a very long list of people
  2. Create an entity for each person
  3. Send an email to each person (step 2 must be completed before step 3 starts)

Because the list of people is very large, I don't want to put them in the same entity group.

In doing step 3, I can query the list of people like this:

Person.all()

Because of eventual consistency, I might miss some people in step 3. What is a good way to ensure that I am not missing anyone in step 3?

Is there a better solution than this?:

while Person.all().count() < N:
    pass
for p in Person.all()
    # do whatever

EDIT:

Another possible solution came to mind. I could create a linked list of the people. I can store a link to the first one, he can link to the second one and so one. It seems that the performance would be poor however, because you'd be doing each get separately and wouldn't have the efficiencies of a query.

4

1 に答える 1

0

更新:あなたの投稿を読み直しましたが、それらすべてを同じエンティティグループに入れたくないことがわかりました。そうせずに強一貫性を保証する方法がわかりません。データを同じエンティティグループに配置する必要がないように、データを再構築することをお勧めしますが、複数に配置する必要があります。おそらく、Personエンティティのグループのいくつかの側面に依存しますか?(たとえば、所属するメーリングリスト、送信される電子メールの種類など)各個人には名前と電子メールアドレスのみが含まれていますか、それとも他のプロパティが関係していますか?

Googleは他のいくつかの選択肢を提案しています

アプリケーションで書き込みの使用量が増える可能性がある場合は、他の手段の使用を検討する必要があります。たとえば、最近の投稿を有効期限付きのmemcacheに配置し、memcacheとデータストアからの最近の投稿の組み合わせを表示する場合があります。それらをCookieにキャッシュしたり、URLに状態を入れたり、その他の完全なものにしたりする場合があります。目標は、ユーザーがアプリケーションに投稿している期間中、現在のユーザーにデータを提供するキャッシュソリューションを見つけることです。トランザクション内でget、put、またはその他の操作を実行すると、常に最後に書き込まれたデータが表示されることを忘れないでください。

そのため、これらの可能性を調査することをお勧めしますが、それらがアプリのニーズにどれだけうまく変換されるかはわかりません。

元の投稿祖先クエリを使用します。

Googleの「強一貫性のためのデータの構造化」から:

一貫性の高いクエリ結果を取得するには、結果を単一のエンティティグループに制限する祖先クエリを使用する必要があります。これが機能するのは、エンティティグループが一貫性とトランザクション性の単位であるためです。すべてのデータ操作はグループ全体に適用されます。祖先クエリは、エンティティグループ全体が最新になるまで結果を返しません。アプリケーションが特定のクエリで非常に一貫性のある結果に依存している場合は、データモデルを設計するときにこれを考慮する必要があります。このページでは、強一貫性をサポートするようにデータを構造化するためのベストプラクティスについて説明します。

したがって、Personエンティティを作成するときは、その親を設定します。特定のエンティティを他のすべての「親」にすることもでき、それによって強い一貫性が得られるはずです。(とにかく、データを祖先で少し構造化するのが好きですが。)

# Gives you the ancestor key
def ancestor_key(kind, id_or_name):
    return db.Key.from_path(kind, id_or_name)

# Kind is the db model your using (should be 'Person' in this case) and
# id_or_name should be the key id or name for the parent
new_person = Person(your_params, parent=ancestor_key('Kind', id_or_name) 

その時点で、同じ親を持つすべてのエンティティに対してクエリを実行することもできます。これはすばらしいことです。しかし、それはあなたが関係なくより一貫した結果を得るのを助けるはずです。

于 2013-01-28T06:02:29.390 に答える