http://static.ianlewis.org/prod/img/appengine/appengine_lowres.png

Appengine 1.5.0 のリリースはかなり大きくて、 Appengine はもっと広い範囲でホスティングプラットフォームになりつつありますね。

1.5.0 は下記のリンクでダウンロードできる。

http://code.google.com/appengine/downloads.html

バックエンド

バックエンドと言う機能がリリースされました。バックエンドは より制御出来るインスタンス。バックエンドは複数のインスタンス を作ることができます。直接ユーザーからリクエストを処理する こともできますし、普通のインスタンスからのリクエストのみを 処理するように設定できます。

バックエンドは2つの週類があります。

動的バックエンドはリクエストによって、インスタンス数が 増えたり、減ったりするタイプです。ですが、今のところは、 20インスタンスまで増える制限があります。

静的インスタンスの場合、インスタンスの数を指定して、 そのインスタンスが常に動いているようになります。

実は、Java はスタートアップが重くて、遅いのですが、立ち上げたら早いので、 バックエンドを Java で書けば、結構早いサーバーを作れるかもしれません。

プル型タスクキュー

API でアクセスして、処理できるタスクキューをリリースしました。プルキューは普通のタスクキューと同じですが、 自動的にタスクを処理するのではなくて、APIでキューに入っているタスクをアクセスして、外部ワーカーで処理する。 プルキューで appengine で出来ない作業などのタスクを外部サーバーで処理することができる。

API でタスクを処理する時に、リース(ロック)することが出来ます。リース時間を指定します。リース時間が過ぎたら、 リースが解放されて、他のワーカーがタスクをリースすることができるようになります。リース時間の間に処理をしなければならないので、 リースのタイムアウトを最悪の時間に近い時間を指定するのが良い。複数のワーカーをリースして、処理する可能性もありますので、 appengine のタスクキューと同じように 冪等 (Idemponent) にしないといけません。 つまり、あるタスクが2回以上実行されても大丈夫であるように書かないといけない。

プルキューのドキュメントはこちら: http://code.google.com/intl/en/appengine/docs/python/taskqueue/overview-pull.html

プルキューを設定する

プルキューを queue.yaml で設定します。プル型のキューは mode プロパティで pull を指定します。 REST API を使う場合は、ワーカーが タスクキューのデータをアクセスできるために、 ACL を指定しないといけません。

queue:
- name: pull-queue
  mode: pull
  acl:
  - user_email: bar@foo.com
  - user_email: user@gmail.coum

Appengine でプルキューを使う

タスクをキューに追加する時に、 プル型のキューのオブジェクトを生成して、タスクをキューに追加します。 タスクオブジェクトを生成する時、 payloadmethod='PULL' を指定します。 payload は タスクを実行できるためのデータです。バイナリデータ(画像データなど)を使うのも可能。

q = taskqueue.Queue('pull-queue')
tasks = []
payload_str = 'hello world'
tasks.append(taskqueue.Task(payload=payload_str, method='PULL'))
q.add(tasks)

payload の最大サイズは Appengine でリースする場合、32MB になりますが、 REST API を使う場合は 1MB しかないので、注意が必要です。 1MB 以上のデータを渡さないといけない場合は、 Google Storage などを使って、必要な URL を payload に渡すのをおすすめしています。

タスクをリースする

Appengine 上でタスクをリースするのが簡単。ここに 'pull-queue' というキューの タスクの百件を1時間リースする。

q = taskqueue.Queue('pull-queue')
q.lease_tasks(3600, 100)

タスクを削除

処理が終わったら、タスクをタスクキューから削除します。 タスクの処理が正常に終わったら、タスクを削除しないとリース時間が切られたら、他のワーカーがリースして処理してしまう。

tasks = queue.lease_tasks(3600, 100)
for task in tasks:
    # タスクを処理する
    do_work(task)
queue.delete_tasks(tasks)

外部サーバーでグルする

プルキューを使う場合、REST APIでタスクを処理することができるので、 カスタムバイナリをつかったり、Perl/Ruby を使ったりするのとか、 appengine で出来ないことが外部サーバーで出来るようになります。

タスクをリースする

タスクをリースするには、下記のURLにPOST する

POST
https://www.googleapis.com/taskqueue/v1beta1/projects/{PROJECT_NAME}/taskqueues/{TASKQUEUE_NAME}/tasks/lease?leaseSecs={LEASE_SECONDS}&numTasks={NUM_TASKS}

返ってくるデータはこんな感じです。

{
  "kind": "taskqueues#tasks",
  "items": [
    {
      "kind": "taskqueues#task",
      "id": string,
      "queueName": string,
      "payloadBase64": string,
      "enqueueTimestamp": number,
      "leaseTimestamp": number
    },
    //...
  ]
}

ここに、 payloadBase64 が返ってくるので、そのデータを使ってタスクを処理する

タスクを削除

処理が終わったら、タスクを削除する

DELETE
https://www.googleapis.com/taskqueue/v1beta1/projects/{PROJECT_NAME}/taskqueues/{TASKQUEUE_NAME}/tasks/{TASK_NAME}

Go ランタイム

Go言語も Appengine で使えるようになりました。 Go はネイティブコードにコンパイルする言語で 結構早いですので、Appengine のアプリケーションとして、 かなりスケールできるアプリケーションを作れるようになると思います。

Appengine のアプリケーションバージョンで同じapp-id で複数の言語 (Java, Python, Go)を使える ので、重いところだけを Go で書くだとか、フロントエンドインスタンスが Python で、 バックエンドは Go で作られているのとか、いろな仕組みができるのではないかと思います。

Python版の非同期データストア API

今まで、Python でデータストアから取得したクエリーの結果がメモリにロードしましたが、 クエリーの結果が大きい場合はメモリが不足になったりするのです。

1.5.0 でリリースされた非同期 API を使えば、クエリーの結果を一つずつ処理することが できますので、メモリに入っているデータが少なくとも済むように処理できます。

非同期 API を使えば、コールバックを指定して、クエリーの結果のエンティティをコールバックに渡して、 コールバックの処理が終わったら、メモリから削除することができます (GC で削除)。それで、同時に メモリに載せているデータが少なくて、メモリをそんなに使わなくても済むのです。

新しいプライシングモデル (未確定)

Appengine のプライシングについて、 Google さんはいろいろ考えているらしい。今まで存在した Appengine for Business の機能が Appengine 自体に統合し、 Appengine のプランを Free, Paid, Premium の3つを作りました。 Free のクオータが減ってきますが、 Paid のほうの 単価が安くなります。ということで、無料で出来ることの範囲が狭くなるが、 Appengine の最初の約束、 利用した分だけ、お金を払うのがまだまだ続くでしょう。

まとめ

もっと詳しい情報、感想などは、日本で開催されるイベントがいくつかあります。 Google I/O の報告会 と、 appengine ja night #16 で発表する予定です。

僕は参加できませんが、Appengine API Expert 同士 @shin1ogawa さんが発表する Google I/O 報告会 in 東京 も、大阪で開催される Google I/O 報告会 in 大阪 あります。

Google I/O はいろいろ熱くて、興味を持っている人がたくさんいて、全部人気過ぎてすでに埋まっているのですが。。。