GAEのアンロードを防ぐ

Google App Engineは2分程度アクセスがないとアプリはアンロードされるような感じになります。


ぶっちゃけフレームワークなしでも結構時間がかかるようになるのでアンロードされるのを防ぎたいところです。

そのため空実装のServletを用意し、そこへcronで2分ごとに使うというのを先日書きました。たまに2分が微妙なラインなのかアンロードされているときがありますが、それでもおおむね95%くらいは常にロードされているような状態になり大幅にレスポンスが改善されます。


そこで1分間隔にするとどうなるか。たまに強制的にリソースの配分が行われてアンロードされることはあるようですが、今のところログを見る限り99%は大丈夫のようです。2分間各に比べて負荷は2倍になりますが、これが問題になることはまずないでしょう。使用しているCPUリソースはロードするときに比べれば全然たいしたことがないです。100%ではないので、起動時の負荷は控えたほうがいいです。JSF2の管理対象BeanのEAGER設定はやらないほうがいいでしょう。


そこでもっとログをよく見てみたところ、アクセスがあったにもかかわらずCPUリソース使用量が常に0というのがあります。

404、つまりファイルがない場合です。


これはいけるんじゃないかとと思い、しばらくやってみましたが、404の場合アプリはロードされていない状態のままでした。残念。



ということはアクセスするURLを見てAppEngine側がはねているということです。おそらくアプリのデプロイ時にweb.xmlやリソース等を登録しておいて、それに該当しないアクセスはもっと手前のゲートウェイではねているということです。


このことからわかるのはサーブレットやフィルターのマッピングに「/*」を使うのはよくないということです。実際今サンプルで公開しているJSF 2.0 x GAEのサンプルはサーブレットマッピングを拡張子jsfにしています。

http://shinsan-jsf2.appspot.com/


JSFはもともとテンプレート志向であるので拡張子でマッピングすると非常にわかりやすいです。拡張子をかえようが、もちろんそのへんのリンクは全てフレームワークがカバーしてくれます。この環境の場合Ajax用Scriptも最後に「.jsf」という拡張子がついてるのが見えます。

また、CSSや画像等のパスも相対でそのままかけるのが非常に大きいです。URLの移動等があった場合、そのまま移動させればよいのだ。アクションの画面遷移も戻り値の戦闘にスラッシュが入っていればコンテキストパスからの絶対になりますし、それがなければ相対です。静的なファイルやPHPのファイルを作成していくのと同じでWebアプリの開発がスタートできるのです。

JSF 1からですが、JSFはActionは戻り値によって画面遷移しますので、それをダイレクトにテンプレートに書いてしまえば決まったルートでの画面遷移だけはそのままいけます。そこにアクションを埋め込んでいくのは難しいことはありません。