まめージェント

Android, GAE, AngularJSの技術ネタ中心。Twitter: @mame01112

Low Level APIを使うことによるDatastore Read Operationsの変化

以前の記事
GAEのDatastore Read Operations - まめージェント
以降、GAEのDatastoreアクセス周りを大幅にリファクタリングしました。

今回は、JDOを使うこと前提の設計から、
Low Level APIで、極力Datastore Read OperationsやDatastore Write Operationsを使わないように変更した結果です。


以前のコードは、こんな感じでした。

String query = "select from " + (table名)
List<データの型> users = (List<データの型>) pm.newQuery(query).execute();



ただ、これだとクエリでヒットした件数分、Datastore Read Operationsを消費してしまうという問題があり、(そもそも設計が悪いのもあるんですが)だいたい私のサービスでの5000回のアクセス(1回のアクセスで複数の処理が走る)で、Datastore Read Operationsの無料枠の5万回を消費していました。


そこで、今回はLow Level APIを使い、できる限りDatastore Read Operationsを使わないように
変更しました。
具体的には・・・

クエリで複数Entityがヒットしないようにする
Datastore Read Operationsを消費しないように、できる限り、Keyだけのクエリにする

など・・・。
※これだけ書くと、何やったのか、多少ボンヤリしてしまいますが・・・。


その結果、
12000アクセスで、Datastore Read Operationsを52%消費(つまり、26,000のクエリ)に押さえることができました。


単純比較、5倍くらいのパフォーマンスを出せてることになります。
Low Level API、すげぇ。
※まあ、これを実現するためには、いろいろと地味な作業をコードでやってたりするんですが・・・。


というわけで、KVSのDatastoreを使うのであれば、Low Level APIがよさそうです。
まあ、サクッとプロトタイプするくらいなら、JDOを使った方がコードも読みやすいし書きやすいので、よいかと思いますが。