読者です 読者をやめる 読者になる 読者になる

makeAsyncCallを試してみたよ

appengine sdk1.2.8がprereleaseされました。
ApiProxyにmakeAsyncCallが追加されたというのはその筋では周知の事実だと思います。

これを簡単に試してみました。slim3を使わせてもらっています。

ApiConfig apiConfig = new ApiConfig();
apiConfig.setDeadlineInSeconds(10d);

long asyncCallStart = System.currentTimeMillis();
Future future = DatastoreOperations.RUN_QUERY.callAsync(queryService.getDefaultQuery(), apiConfig);
long asyncCallEnd = System.currentTimeMillis();

int notDoneCount = 0;
while (!future.isDone()) {
++notDoneCount;
}
long callEnd = System.currentTimeMillis();


String responseString = null;
try {
responseString = future.get().toFlatString();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}

requestScope("notDoneCount", notDoneCount);
requestScope("asyncCallTimeMills", asyncCallEnd - asyncCallStart);
requestScope("callEndTimeMills", callEnd - asyncCallStart);
requestScope("responseString", responseString);

queryServiceというのはprotocol bufferを作ってくれる君でkind全体を検索するようにしています。事前にkindには適当なmodelをつくって10個putしています。DatastoreOperations.RUN_QUERYというのは僕が作ったapiの中に入っていて、protocol bufferのqueryを実行してくれます。

まだローカル環境でしか1.2.8が試せないのでなんともですが、感想をいくつか。

・当然ですが戻りがFutureになるので、既存apiをasyncにするのは結構めんどくさそう。1.2.8のcom.google.appengine.api.datastoreにはFutureを返してくれるメソッドがないので、AsyncDatastoreとか実装することになるのかまだわかんない。javadoc読まないと。。
・notDoneCountが、僕のPCの性能がいいからか889990とかそのくらいのオーダーになる。productionでサービスの非同期呼び出しを待ち合わせする場合どの程度の回数ループするかわかんないけど、cpuを無駄に使うことにならないかな?Thread.sleepはokなんだっけか?
・asyncCallTimeMillsは0とか3とか10msには届かないくらい。いまは簡単なqueryしかなげてないけど。index explosion問題はあるものの、composit indexを使わないといけないようなケースで別の処理が先に実行できる場合(あるかどうかわかんないけど)は有用では。
・ちなみに、callEndTimeMillsは今回テストした範囲では10msとかなので軽いapi呼び出しについてasynccallしても待ち合わせに無駄に時間とお金(cpu課金)されるので、なんでもasyncにすればよいというものではないと思います。
・taskqueueとの使い分けも考える必要があるけど、ビジネスロジック的なものを含むとか自動的な再実行が必要とされるとかいうときはtaskqueue、普通のサービス呼び出しだけど複数のサービス呼び出しを実行するので結果的に重くなる(時間がかかる)ので並列実行させたいとかいうときはasynccall、ということになるんじゃないかと思います。


producutionで動くと思い込んでいた僕にいろいろアドバイスをくれた@shin1ogawaさん、ありがとうございます。



最後に、appengine sdk1.2.8 prereleaseはローカル環境でしか動きません。大事なことなので2回いいましたよ!!