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フェッチでの送信なども.