みちのぶのねぐら

Logo 工作室 // 厚生部 // 政治局

Google App Engine は “multiple web servers”

Update: 2010-10-25

先日から Google App Engine を Java で試しているのですが、どうも挙動がおかしいのです。アクセスするたびに初期化をやり直しているような雰囲気なのです。 Singleton のオブジェクトに格納して置いたはずのキャッシュデータを意図した通りに読んでくれていないようなのです。

ドキュメントを読み直すと書いてありました。

“App Engine uses multiple web servers …”

「クラウド」なわけだ。 Servlet の初期化も結局のところ、最初にアクセスされたときになるそうです。

さらに、これは挙動を見ての推測なのですが、この “multiple” は、 1以上じゃなくて 0以上のように思えます。一度リクエストして起こしても、しばらく放置しておくとまた寝てしまうということです。この推測が正しとして、挙動を見る限り、「しばらく」というのは 5分か 10分のことのようです。

そのようなわけで、私は、まず、テンプレートエンジン Velocity の利用を止めました。これが好きなんですが、というか、JSP があまり好きではないのですが、少しでもアクセス時にロードし直すライブラリを減らすためです。 JSP に変えたところ、少しマシになりました。

そこそこ頻繁にアクセスがあるサイトでないと Java は向かないということなのかな。いっそのこと Python に変えてしまいたいところですが、 LZH の解凍するライブラリが見つからないし。 cron と Task Queues による定時の Job の実行の際にも、「まず一度何かを呼び出して、目を覚まさせてから」という手順にした方がよさそうです。

2010-10-26 追記

Spring Framework も外してみました。基本的な IoC と Spring MVC の機能しか使っていなかったので、自前の Application Context とコントローラを呼び出すサーブレットなどを作って、サービスや DAO は変更無しで済ませました。本番環境の前に、ローカルのテストサーバの起動が速くなりました。本番環境でも、おおむね数秒で目を覚ましてくれるようになりました。

トップページを静的なページから JSP に変えて、そこで Application Context を呼び出し、ほとんどのクラスを参照させるようにしています。トップページでも他のページでもどれか一つを表示しさえすれば、その後は、どのページもほとんど待ち時間無しで表示できるようになりました。

2010-11-13 追記

現在、 Googlebot さんが定期的にアクセスしてくれていて、寝るヒマが無くなっているようです。 30秒〜5分毎くらいかな? HTML 版の一覧のページ数が多いから、一巡するのにけっこうかかるようです。こんな他力本願な解決方法があったとは