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を使った方がコードも読みやすいし書きやすいので、よいかと思いますが。