GAE の datastore を更新直後に読むと古い値が返ってくる。
2014/5/30
CAP的にBASE型なのでそういう仕様なのだが、注意が必要。以下、実際のログより。
13:15:12,154] datastore.read value=3 // 元の値は3 13:15:21,608] datastore.put value=4 // 4に更新して 13:15:21,638] datastore.read value=3 // 30msec後に読んでも古い値 13:16:10,522] datastore.read value=4 // 時間がたてば新しい値
1つの対処方法として、更新直後に再読み込みする場合は、クライアント側で100msecの遅延を入れるとよい。
もう一つの対処はサーバー側で memcached を使う。memcached なら直後に読んでも新しい値が返ってくるので、クライアントの対処は不要。
13:17:29,832] memcache.read value=4 // 元の値は4 13:17:35,990] datastore.put value=5 // datastoreを更新 13:17:36,005] memcache.set value=5 // memcacheも更新 13:17:36,020] memcache.read value=5 // 直後(15msec)でも新しい値