先日、発表されて以来、各所で話題になっているGoogle App Engineだが、これでcronのように定期的にバッチ処理を実行させたいときにはどうすればいいのだろう?
Livedoor Readerのようなサービスであればフィードを読みに行く処理が必要になるし、はてブのようなソーシャルブックマークサービスでも人気ブクマなどの集計は、ユーザが表示するごとに行うよりも定期的に処理を行う方が効率がいい。 ユーザへのレスポンスとは別に、定期的に処理が実行できるか否かというのは重要なポイントだ。
調べてみるとWhat Is Google App Engine?には以下のように書かれていた。
Application code only runs in response to a web request, and must return response data within a few seconds. A request handler cannot spawn a sub-process or execute code after the response has been sent.
(※アプリケーションコードはWebリクエストに対してのみ動作し、レスポンスは数秒以内に返さなければならない。リクエストハンドラはサブプロセスを生成したり、レスポンスのあとにコードを実行することはできない。)
一応、Google App Engineのページを一通り簡単に見てみたが、cronのように定期的にバッチ処理を行うような機能は見つからなかった。
(※私は先着1万人に間に合わなかったので、アカウントを持っている人専用のページはチェックできていない。)
- ユーザが表示したタイミングで処理をする
- 別サーバから定期的にリクエストを送信する
- 定期的にユーザにリクエストを送信させる
この方法では、一回の処理コストを減らしてユーザが表示ごとに処理を行わせるか、最後に処理してから一定時間が経過したあとのリクエストで処理を行わせることになる。 前者はともかく、後者では処理を行うときに表示が著しく遅れることになる。 しかも、数秒以内にレスポンスを返さなければならないという制限にひっかかる可能性がある。
この方法では、自分でサーバを用意するか、WebCronのような定期処理を行うWebサービスを利用することになる。 前者は定期処理のためだけにサーバを用意するというのはめんどくさい。
どちらにしても、必要以上に処理を行わないように、スクリプト側で一定時間内に一定回数までしか処理を行わないようにするか、なんらかの認証を付ける必要もある。 Webサービスを利用して定期的にリクエストさせる場合には、そのサービスが認証に対応していないと、認証を使った制限を付けることができないことに注意。
この方法では、出力するHTMLに一定時間ごと以下のようなタグを含める。
<img src = "http://xxxxxxxxxxxxxxxx/batch" />
要はよくあるアクセス解析の方法と同じだ。 これでユーザからリクエストをしてもらう。 この場合にも、一定時間内に一定回数までしか処理を実行できないように制限を付ける必要がある。
どの方法を選ぶにしても、いずれcronのような機能が提供される可能性があるので、簡単に対応できるようにしておくのがいいだろう。