App Engine Backend

1.5.0 からサポートされるようになった(比較的)新機能のBackendについてまとめておく。

Backendとは

AppEngineのようなスタイルのクラウドでは複数の不特定多数のユーザが資源を共有するため、一人のユーザが他のユーザに対して与える影響を予測可能な範囲におさめなければならない。このため、一人のユーザに提供する資源に量的な制約を加える必要がある。AppEngineでは、この制約は典型的に「30秒ルール」に現れている。30秒ルールとは、Webアプリケーションとして稼働するサーブレットの実行時間が30秒に限定されていること。30秒を超えると打ち切られてしまう。2010年12月の1.4.0で、タスクキューやCronに関しては10分まで許されるようになったが、それでも、限界があることにはかわりがない。
Backendは、このような縛りのない実行を実現する。実行のトリガーはWebアクセスであり、実行ルーチンはサーブレットの形を取るものの、事実上任意のプログラムを無限に実行し続ける(つまりhttp的にreplyを返さないで)ことを可能にする仕掛けだ。さらに、CPUやメモリの量も選ぶことができるし、課金も実際に使用したCPU時間ではなく、インスタンスが起動している時間に対して行われる。
PaaS とかIaaSとかいう分類で言うと、AppEngineは典型的なPaaSだったのだけど、そこから一歩IaaSの方向に踏み出した、と整理してもいいだろう。

resident と dynamic

Backendにはresidentとdynamicの2種類がある。residentはリクエストが来ていない場合でも常にオン
となる。再起動しないので、リクエストをまたいでインスタンス内のメモリ状態が保たれていることを期待できる。ただし、予告なくシャットダウンされることもあるので、ユーザが注意しなければならないことには変わりはない。dynamic はリクエストが来ないと自動的に停止される。通常のインスタンスに近い挙動だ。

使い方

いろいろ使い方はあるのだろうけど、residentの場合は基本的にPull Task Queueと連携させてつかうのだろう。通常のインスタンスがキューにタスクを積み、residentでそれを処理する、という使い方。たとえば全文検索のためのインデックス作成なんかをresidentでやるといいのかもしれない。

スケール

dynamicの場合、インスタンス数の最大値を指定することができる。residentの場合はインスタンス数を直接指定する。これらの設定値はインスタンスを再起動することなく、クライアントから設定し直すことができるの。

並列リクエス

1つのインスタンスで同時に処理することのできるリクエスト数をで指定することができる。

お値段

Backendの課金は、実際に使用したCPU時間ではなく、インスタンスがオンになっていた時間に対してかけられる。普通のインスタンスはB2相当だけどそちらは、$0.10/時であることを考えると、ちょっと割高な印象。

クラス メモリ CPU お値段
B1 128MB 600MHz $0.08 /時
B2( default) 256MB 1.2GHz $0.16 /時
B3 512MB 2.4GHz $0.32 /時
B4 1024MB 4.8GHz $0.64 /時

ちょっとおもしろいのは、落としてから15分間は課金の対象となる、ということ。なんだこの中途半端な15分という時間は?

所感

バックエンドによってAppEngineの芸の幅が広がったことは間違いない。でも、ちょっと高価すぎるんじゃないだろうか。場合によってはEC2と組み合わせて使う方が安価でいい、ということになりかねないような。