Google AppengineにJerseyをディプロイしたときのspin-up

現代はjerseyを見失った時代だ - you know something? | Use it for myself.
こちらのサイトに書かれているとおりで、Google appengineにJerseyを使ったアプリケーションをディプロイすると、インスタンスの起動に結構時間がかかります。時間を短縮することができないか、少し調査・計測してみました。私はappengineで本格的な開発を行ったことはないので、間違った点があるかもしれませんが。。

手順としては、以下の順に変更を加えながらGAEディプロイしていって、spin-upを見てみました。

  1. Eclipse Google pluginで素のプロジェクトを作成した状態
  2. Jerseyのjarを追加した状態
  3. Jerseyのservletをweb.xmlに追加した状態
  4. servletのinit-paramで"javax.ws.rs.Application"を指定した状態
  5. servletのinit-paramで"com.sun.jersey.config.feature.DisableWADL"を指定した状態
  6. JSONサポート機能を使用した状態

動かしているJAX-RSのコード自体はextjsのREST機能の調査用に作成したものをappengineにアップロードしたものでDatastoreは利用していません。特に複数回の平均をとったりはしていないので、だいたいこんな感じということです。

1. 初期状態 606cpu_ms
2. + jersey jar 1050cpu_ms
3. + jersey servlet 6510cpu_ms
4. + Application 5343cpu_ms
5. + no-WADL 4270cpu_ms
6. + JSON 4690cpu_ms

Jerseyはデフォルトでは/WEB-INF/libと/WEB-INF/classesをスキャンするようなので4番目でApplicationクラスを指定すると1000cpu_ms程度、また、WADLを生成する場合にも各リソースのメソッドをスキャンしそうなので、これを無効にすると1000cpu_ms程度は改善できるようです。他にも不要な機能をServletの初期化時に読み込まないようにできれば、もう少し短縮できるんじゃないかな、という気はしていますが方法がわかりません。

画面が描画されるまでに5秒だとちょっと厳しいですが、extjsのようなJavaScriptのUIのコードからJSONを取得するケースでは、画面自体は描画されてロード画像を表示しておけるので、アプリケーションの用途によってはギリギリ使えるかなっという気もします。あえてJAX-RSのためにJerseyを使う必要もないので、Restletやjsonengineも試してみたいと思います。

しかし、appaengineは思いのほか早く数分でインスタンスがシャットダウンされてしまうのですね。そして、すぐにインスタンスが増える。