App Engine 1.3.0 とBlobstore

ついこの間1.2.8がでたばっかりなのに,もう1.3.0がでた.ここのところのGoogleのラッシュはすさまじい.クリスマス休暇に入る前に,今年やった仕事を全部リリースしようとしてるんじゃないだろうか.

Blobstore

1.3.0 の目玉はBlobstoreというデータストア.Blobstoreは,その名の通り,blob(binary large object)をストアすることに特化したストレージである.Python版とJava版の双方でサポートされている.
ただしexprimentalで,APIは今後変更される可能性がある.さらに,現在のところ,課金ユーザのみが利用できるようだ.もちろん,開発サーバでは,だれでも利用できる.
また,現在のところ1つのblobのサイズは50メガバイトに制限されている.本格運用されればこの制限は緩和されるだろう.

これまでの問題点

これまでApp Engineは,パーシステントなデータをストアする場所として,DataStoreのみを提供していた.もちろん,DataStoreにはバイト列を納めることもできるが,アップロードやダウンロードはプログラマが管理しなければならなかった.さらに,HTTPを利用したアップロードや,ダウンロードには,10メガバイトの制限があり,これ以上のデータをやりとりすることはできなかった.

Blobstoreでできること

Blobstoreを用いると,サーブレットを経由することなく,ブラウザ(というかクライアント)とBlobstore間でデータを転送させることができる.転送サイズの制限も10メガバイトに束縛されなくなる.

blob をアップロードすると,BlobInfoというKindのエンティティが自動的に生成され,ここに日付やサイズなどのメタ情報が納められる.

blobアップロード時には,APIを使って作った特別なURLを用いる.このURLを作る際に,アップロード終了後に呼び出される管理用サーブレットのURLを渡しておく.
アップロードはblobサービスが処理し,データは直接 blobstoreに書き込まれる.datastore上のメタ情報も更新される.

アップロード終了後,blobサービスはリクエストを書き換えた上で,プログラマの指定した管理用サーブレットを呼び出す.

+------+    special url  +-------------+      +---------+
|client| --------------->| blob service| -+-->|blobstore|
+------+              +--|             |  |   +---------+
                      |  +-------------+  | 
                      |                   |   +---------+
            redirect  |                   +-->|datastore|
                      |                   |   +---------+
                      |  +--------------+ |
                      +->| mgmt servlet |-+
                         +--------------+
blobのダウンロード

ユーザにblobをダウンロードさせるのは簡単で,レスポンスに特定のヘッダをつけるだけ.コンテナがヘッダを検出して,レスポンスを書き換えてblobstoreから取りだしたデータをcontentにセットして返却する.実際には,

      blobstoreService.serve(blobKey, res);

とやるだけでよいらしい.

制約

blobはアプリケーションから読むことはできない.変更することもできない.できることは削除だけ.

所感

サーブレット経由でblobをdatastore上に書いたり読んだりするのはいかにもバカっぽかったので,ずいぶん便利になる.ファイルサイズの制限が緩和されるのも大きい.スピード的にもかなり貢献するんじゃないだろうか.

だけど,いまのところ,メイルで添付したりはできなさそうだな.. Mail APIのほうで対応したりするんだろうか.

1.3.0では,blobstore以外にも,reflectionの10%の高速化がなされたという.jRubyなどの動的言語を使う場合に効いてくるらしい.

いずれにしろ, さらにできるようになったな,という感じか...

追記 12/16

コメントでも教えていただいたが,Imageをblobstoreから作るメソッドが追加されている.

Image ImagesServiceFactory.makeImageFromBlob(BlobKey blobKey)

ただ,今現在はこうやって作ったImage上のメソッドはほとんどUnsupportedException になる,とのこと.

また,書き出しのほうはサポートされていないようだ.

BlobKey ImageService.applyTransformToBlob(Transform transform, Image image);

みたいな感じのものがサポートされるのかな.

理想的には,アップロード,イメージ処理,ダウンロードを,サーブレットに一切データをロードせずにやりたいところ.さらにはMail添付,URLフェッチでの送信なども.