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)でも新しい値


©