Download - #ajn3.lt.marblejenka
makeSyncCallで
いろいろ試してみた#ajn3ライトニングトーク
自己紹介
@marblejenka
•普段のお仕事
• java/c++な金融系業務システム開発
• appengineとの関わり
• なんかいろいろ楽しそうだったからはじめてみた
• balmysundaycandyというmakeSyncCallしやすくするライブラリをつくり中
makeSyncCallとは!
makeSyncCall• appengineにおけるサービス呼び出しを実行する
(UserServiceの一部を除く)
• サービス呼び出しはprotocol bufferでシリアライズして通信、それを実現しているメソッド
• stubの実装はproduction側で管理
• 個人的にはEnvironment上書きとは別物と理解すべきと思ってます
• makeSyncCallによるサービス呼び出しを、通称more low level apiと呼びます
Why more low level?(today’s goal)
• low levelより速い?
•いろいろなapiを経由するより直で触った方が高速では!?
•できないことができるかも?
•公開されていないapiを触れる!?
• appengineの勉強になる?
• JDOに対するlow level apiなのか!?
more low levelは高速か?
検証内容• low level vs more low levelでの比較
• 交互に1件のエンティティをget
• 1リクエストで50回実行、20回繰り返し各1000サンプルを採取
• ※datastoreには対象kindを10000件程度putした状態にしてあるが、前評判通りstoreされているデータ量にパフォーマンスが依存しないのは確認済み
0
75
150
225
300
1 3 5 7 9 11 14 17 20 23 26 29 32 35 38 41 44 47 50
low level vs more low level
more low levellow level
結果の分布:横軸に所要時間ms、縦軸に発生回数ほとんど差異はない(むしろ20ms近傍が気になる)
more low levelはいろいろできる?
datastore#count•queryに対する件数が取れる
com.google.apphosting.api.DatastorePb.Query query = new Query(); query.setApp(APPID); query.setKind(KIND_NAME); Integer64Proto countproto = DatastoreOperations.COUNT.call(query);
• ※以降、ピンクをprotocol bufferオブジェクト、青字部分はぼくのライブラリを使っている箇所として記載しています
datastore#GetIndices• composite indexの情報がとれる
StringProto request = new StringProto(); request.setValue(APPID); CompositeIndices response = DatastoreOperations.GET_INDICES.call(request); ---------------------------- state:2 entity_type: "TEST" ancestor: false Property { name: "hoge" direction: 1 } Property { name: "hige" direction: 1 }
datastore#getScheme
• スキーマ情報がとれる(が、productionでは動作せず。。)
GetSchemaRequest getSchemaRequest = new GetSchemaRequest(); getSchemaRequest.setApp(appid); Schema schema = DatastoreOperations.GET_SCHEMA.call(getSchemaRequest);
datastore#getScheme property < name: "name" value < stringValue: "none" > multiple: false >>more_results: false
※ entity_groupは、more low levelでgetしたときも取得できる
kind < key < app: "balmysundaycandy" path < Element { type: "TEST" } > > entity_group <
> property < name: "age" value < stringValue: "none" > multiple: false >
まだまだ謎も多い
•DatastoreOperations.ADD_ACTION
•DatastoreOperations.NEXT
•DatastoreOperations.EXPLAIN
•DatastoreOperations.DELETE_CURSOR
more low levelは勉強になる?
こういうことがわかる• 実現可能なアーキテクチャの(おそらく最小粒度の)素材に何が使えるかわかる
• appengineには43のサービス呼び出しが定義されており、その組み合わせでapiが実現されている
• 先に紹介したような、low level apiでも提供されていないものもある
• 将来実現されるかもしれないapiを先取り!?
• サービス呼び出しのなかでも比較的複雑なdatastoreの仕組みが垣間みれる
• トランザクションの開始、rollback、commitもそれぞれ一つのサービス呼び出しとして実現されている
ところで
appengine 1.2.8prerelease!!
makeAsyncCall
非同期なサービス呼び出し!!
Future<QueryResult> future = DatastoreOperations.RUN_QUERY. callAsync(query, apiConfig);long asyncCallEnd = System.currentTimeMillis();int notDoneCount = 0;while (!future.isDone()) { ++notDoneCount;}long callEnd = System.currentTimeMillis();
makeAsyncCall
TQじゃだめなのか?
• taskqueue
• 例外発生時の自動再実行&冪等性
• レスポンスは今のところ返せない
• more low level async
• 単純なサービス呼び出しを非同期化
• deadline決めうち、30秒を超えない範囲の並列化 or non blocking
• レスポンスは返せるが、並列化できる処理に限る
wrap up!
• low levelより速い?
•そんなことはなかった。
•できないことができるかも?
•触れないこともないが、実開発と言うよりはツール向けの機能という印象。謎もある。
• appengineの勉強になる?
• なります!まぁこころの持ちようかも?
Async時代はmore low levelが制する!?
Thank You!!