Twitterで @zaki50 さんのツイート:
GAE の HRD が eventual consistency ってのは memcache とすごく相性悪くない? データ更新後にキャッシュを破棄してもそのあとのread で古いの読んでキャッシュしちゃったらものすごく残念なことになる気が。なんか作り方間違ってるのかな...
— ざきごーまるさん (@zaki50) 4月 18, 2012
これはその通りで、データ更新時に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に設定しても、何の効果もない」と書いてありました。
0 件のコメント:
コメントを投稿