Google App Engine 1.4.3

安定してバージョンアップを続けるApp Engine. 1.4系も4つめとなる1.4.3がでた。今回もいくつか面白そうなものが。

Prospective Search

Python版のみ。簡単なストリームコンピューティングができる。通常のデータストアに対する検索は、データが蓄積されているところにクエリを投げて答えを得るが、Prospective Searchではこのデータとクエリの関係が逆転していて、クエリをいくつか蓄積しておいてそこにデータを通す。データがクエリの条件にマッチしていると、結果が帰ってくる、という仕掛け。
これって、App Engine Ja Night 12 でお聞きした、Matcher API ですよね?

ストリームコンピューティングはいまちょっと流行ってるけど、この仕掛けでどの程度のことができるのか調べないと。

Concurrent Requests

Java 版のみ。普通のServletと同じようにマルチスレッドになった、ということ。
通常のServletはマルチスレッドで動く。つまり二つのリクエストが同じServletに同時にアクセスした場合、それぞれのリクエストに対して個別のスレッドが立ち上がり、同時に処理を行う。したがって、Servlet排他制御が必要な資源にアクセスする際にはプログラマが明示的に排他制御を行う必要がある。
ところが、これまでApp Engineではなぜか一つのインスタンスでは1つのスレッドしか起動しないように制御されていた。複数のリクエストを同時に処理するには複数のインスタンスが用いられていた。普通に考えると、この方法はあまり効率的ではない。それでもこういう方法を採っていたのは、たぶん資源管理がラクだからなのだろうと想像していたのだが、管理する方法の目処がたったということなのだろうか。
しかし、これはちょっと危険。普通Servletを書くときにはスレッドセーフになるように気をつけて書くけど、なまじApp Engineではこれまで気にしなくてよかっただけに、気にしないで書いてた人もいたかも。その場合、マルチスレッドをオンにしたらすごく変なことがおきたりするかもしれない。

appengine-web.xml に下のように書くとマルチスレッドで動くようになる。

<threadsafe>true</threadsafe>

Remote API とDeferred API

Pythonには古くからあったけどJavaにはなかった機能がようやく。Remote API を使うと、サーバのデータストアに対してローカルマシンから直接操作ができる。Deferred はTaskQueueを簡単に使える用にする仕掛け。私も自作して、「すっきりわかる」にもコードがのせてあるけど、こちらのはタスクをRunnableのようなクラスで定義してPayloadに組み込むという形式のようだ。あまり洗練されてるとは言い難いような。。

BlobStoreに対して File読み書き

これまで、BlobStoreへは非常に限定的な方法でしかアクセスできなかったと思うのだけど、とうとうできるようになったらしい。しかも普通のChannel APIで。画期的だけど、性能的に大丈夫なのかなー。。あと、当然トランザクションは効かないだろうけど、書いてる途中でタイムアウトしたらどうなるんだろう、とか考えると使い方は結構難しいかも知れない。

TaskキューとCronの改善

  • タスクが実行されるアプリケーションバージョンを設定できるようになった。
  • 11時から17時までのあいだ5分おきで、みたいな指定ができるようになった。

所感

最近ちゃんとフォローしていなかったけど、着実に進歩している。特に、Concurrent RequestがScale Out性にどういう影響を与えるのか、興味深い。