0

結果整合性が非常に難しい、かなり典型的なユースケースがあると思います。これを支援する Python フレームワークを既に作成している人がいるかどうか疑問に思っています。

一連のエンティティに対してクエリを発行する GET リクエストがあります。それらはめったに更新されません。一度に 1 つのエンティティを更新するための POST 要求があります。エンティティを更新すると、GET 要求に表示されるかどうか/どのように表示されるかに影響します。

エンティティはめったに変更されないため、GET リクエストを長期間 (たとえば数日または数週間) memcache したいと考えています。そのため、エンティティを更新するための POST を取得するまれな機会に、memcache をクリアできます。

POST リクエストを処理し、エンティティを更新し、キャッシュをクリアし、その後すぐに GET リクエストを受信した場合に問題が発生します。最終的に一貫性のあるデータストア クエリは古いクエリ結果を表示する場合があり、その後数日間 memcached に保存されます。または数週間。

単純にデータストアを更新してキャッシュをクリアする代わりに、次のことを行う必要があります。

1. update the datastore
2. get the cached query
3. modify the cached query (with the proper sorting too!)
4. update the cache with the new modified query results (with a cas() operation)

これは十分に一般的な問題のようです。この問題を軽減するのに役立つ Python フレームワークはありますか?

データストア クエリはすべてのキャッシュをバイパスするため、ndb は役に立ちません。

問題があれば、私は現在 django-nonrel を使用しており、django-tastypie は GET リクエストを処理します。

4

1 に答える 1

0

GAE で memcache を使用した私の理解/経験から、非常に大量のトラフィックを処理していない限り、データは削除されますが、それでも保証されません

ただし、クエリのスコープをエンティティ グループに限定することで、強力な一貫性が提供されるため、Ancestor クエリを使用できるはずです。ドキュメントから:

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

GET リクエストがある種のユーザーまたは他の識別可能な「親」に関連付けられている、またはこの GET によって取得されるすべてのエンティティで共有されるグローバルな親を作成できると仮定すると、その親を使用して強い一貫性が送信されました。

ドキュメントの例を次に示します。

そして、ここに私が尋ねた関連する質問があります。これは、親、キー、およびクエリ ID を簡単に設定するためのいくつかの優れたトリックを示しています: NDB using Users API to form an entity group

于 2012-12-10T03:17:14.913 に答える