メニュー

2012年4月18日

Eventual consistencyなクエリ結果のキャッシュ

AppEngineのHigh Replication環境では、QueryはEventual consistencyです。

Twitterで @zaki50 さんのツイート:


これはその通りで、データ更新時にmemcacheをdeleteしても、次のキャッシュ作成のタイミングで更新されたデータが読み込まれない場合があり、新しく作りなおしたキャッシュが古い内容のままになる可能性があります。

対応策としては

  • キャッシュの削除ではなく、キャッシュを上書きする

が考えられます。

データを更新した時、そのコンテキストでは何を更新したか分かっています。
そこで、Eventual consistencyでクエリを行い、そのクエリ結果と更新したエンティティをマージして、
新しいキャッシュを作成し、保存します。

これにより、作成されたキャッシュは新しい内容になります。


(更新メモ)
記事作成時はクエリをStrong consistencyにする方法を紹介しましたが、HRDでの非Ancestorクエリは常にEventuallyのようなので、修正しました。

https://developers.google.com/appengine/docs/python/datastore/queries#Setting_the_Read_Policy_and_Datastore_Call_Deadline
Setting the read policy to strong consistency for a non-ancestor query in the High Replication Datastore will have no effect.
「HRDではread policyをstrong consistencyに設定しても、何の効果もない」と書いてありました。