スティルハウスの書庫の書庫

はてなダイアリーで書いてた「スティルハウスの書庫」を移転してきました。

Protocol Buffer on HTTPでクライアントからDatastoreを直接呼び出し

shin1ogawaさんのエントリ:「#appengine JavaのLow-Level API入門 Relationship編

ここまで読んでしまうような変態な皆さんは、フックする為に使用しているMyDelegate#makeSyncCall()メソッドが気になって仕方無いですよね。特に第四引数であるbyte[] requestとかいうヤツ。「…何が入っているんだろう…というか全部が入っているんだよね?何でも取得できるよね」という予測ですよね!ズバリその通りです、ここに全部入っています。ただ、この中身は実行されるサービスによって変わる、ProtocolBufferによるシリアライズの結果です。例えば今回使った DatastoreサービスのPUTメソッドであればcom.google.apphosting.api.DatastorePb.PutRequestオブジェクトに組み立てられます。Mailサービスならcom.google.appengine.api.mail.MailServicePb.MailMessage、といったような具合です。

変態認定されてしまった。ApiProxyの中身はさっぱり知りませんでしたけど、API呼び出しは全部ProtocolBufferでシリアライズしてmakeSyncCallでリモート呼び出してるのですね。。おじさん世代なのでRMIやCORBAのORBが同じような仕組みだったのを思い出します。

ところでmakeAsyncCallってあるのかな? まあコールバックを受け取る窓口がないか。。

SDKの中にはcom.google.apphosting.utils.remoteapi.RemoteApiServletといぅサーブレットが存在しています。こいつは、POSTメソッドの実装の内側でPostされたバイト配列を組み立ててサーバ側でmakeSyncCall()する仕組みになっています。…面白いですよね?

ということは、GoogleGWTFlash上でProtocol Bufferを実装してくれれば、このサーブレットを経由してApp EngineのAPIをブラウザから直接呼び出しできるってことですね。HTMLページでscriptタグ書いて、pm.makePersistence(foo)って書くだけで、JSオブジェクトをDatastoreに保存してくれるとか(もはやJDOに合わせる必要はないか)。

スケーラビリティや可用性を気にする必要もないし、Ajax/GWTFlex/AIRHTML5等によるRIAが普及すればサーバー側ロジックは少なくて済むし、いずれサーバー開発者は駆逐されるかもしれませんね(ToT) サーバ側のコードはストアドプロシージャ的用途で細々と生き残るのかもしれません。

ちょっと調べたら、GWTでProtocol Bufferを実装して〜というリクエストはやっぱりありました:
http://code.google.com/p/google-web-toolkit/issues/detail?id=2649

あわせて読みたい、白石さんのProtocol Bufferまとめ:
XMLはもう不要!? Google製シリアライズツール「Protocol Buffer」