10
appengine java night #2 ProtocolBuffer on HTTP shin1ogawa@株式会社トップゲート

Appengine Java Night #2 LT

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Appengine Java Night #2 LT

appengine java night #2ProtocolBuffer on HTTP

shin1ogawa@株式会社トップゲート

Page 2: Appengine Java Night #2 LT

各サービスの実行の仕組みApiProxy#getDelegate()

Application

LowLevelAPI

ApiProxy#getDelegate()

サービスのStubサービス本体

PBPB

Page 3: Appengine Java Night #2 LT

Delegate#makeSyncCall()Service名,Method名,Request(byte[])

ApiProxy#getDelegate()#makeSyncCall()

サービスのStub/本体PB(byte[])

Page 4: Appengine Java Night #2 LT

重要な事実に気づいたねっとりとServer側を監視してたら…

•デプロイ環境でApiProxy.setDelegate(覗き見Delegate)して、実際のサービスとやりとりされるProtocolBufferオブジェクトを観察。

•よくよく観察してみると、ローカル環境と同じProtocolBufferオブジェクトが使用されている。

Page 5: Appengine Java Night #2 LT

何か思いついちゃった!つまり•ローカル環境でOreOreDelegateを実装し、#makeSyncCall()をフックして、Stubにリクエストを渡さずそのままデプロイ環境へ転送する。

•デプロイ環境は受け取った値を使用してApiProxy.getDelegate().makeSyncCall()を実行し、結果をローカル環境へ返す。

•ローカル側のOreOreDelegateはその結果を何食わぬ顔でLow-Level APIへ返す• Low-Level APIを経由してApplicationまで返る

Page 6: Appengine Java Night #2 LT

ProtocolBuffer on HTTP左がローカル環境、右がデプロイ環境

OreOreDelegate

サービス本体

OreOreServletPB

PB

Application

LowLevelAPI

PB

Page 7: Appengine Java Night #2 LT

MakeSyncCallServletサーバ側でmakeSyncCall()するだけString serviceName = req.getHeader(SERVICE_NAME);String methodName = req.getHeader(METHOD_NAME);byte[] requestBytes = IOUtils.toByteArray(req.getInputStream());byte[] responseBytes = ApiProxy.getDelegate().makeSyncCall( ApiProxy.getCurrentEnvironment(), serviceName, methodName, requestBytes);resp.getOutputStream().write(responseBytes);

Page 8: Appengine Java Night #2 LT

MakeSyncCallDelegateMakeSyncCallにつなぐだけpublic byte[] makeSyncCall( Environment environment, String serviceName, String methodName, byte[] request) throws ApiProxyException { return protocolBufferOnHttp( environment, serviceName, methodName, request);}byte[] protocolBufferOnHttp(.....) { // makeSyncCallにPostしてbyte[]を受け取るだけ。}

Page 9: Appengine Java Night #2 LT

あっさり動いたこの仕組みを使うと

•ローカル環境でDatastoreにクエリ"なぜかデプロイ環境のDatastoreの結果が返る

•ローカル環境でDatastoreに保存"なぜかデプロイ環境のDatastoreに保存される

•ローカル環境でMemcacheをクリア"なぜかデプロイ環境のMemcacheが空っぽ

Page 10: Appengine Java Night #2 LT

ご清聴ありがとうございました!

shin1ogawa@株式会社トップゲート