Engineer in Tokyo

App Engine 1.5.0 がリリースされました

image

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

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

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

バックエンド

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

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

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

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

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

プル型タスクキュー

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

API でタスクを処理する時に、リース(ロック)することが出来ます。リース時間を指定します。リース時間が過ぎたら、 リースが解放されて、他のワーカーがタスクをリースすることができるようになります。リース時間の間に処理をしなければならないので、 リースのタイムアウトを最悪の時間に近い時間を指定するのが良い。複数のワーカーをリースして、処理する可能性もありますので、 App Engine のタスクキューと同じように 冪等 (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

App Engine でプルキューを使う

タスクをキューに追加する時に、 プル型のキューのオブジェクトを生成して、タスクをキューに追加します。 タスクオブジェクトを生成する時、 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 の最大サイズは App Engine でリースする場合、32MB になりますが、 REST API を使う場合は 1MB しかないので、注意が必要です。 1MB 以上のデータを渡さないといけない場合は、 Google Storage などを使って、必要な URL を payload に渡すのをおすすめしています。

App Engineでタスクをリースする

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

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

App Engineでタスクを削除

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

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

外部サーバーでグルする

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

外部サーバーでタスクをリースする

タスクをリースするには、下記の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言語も App Engine で使えるようになりました。 Go はネイティブコードにコンパイルする言語で 結構早いですので、App Engine のアプリケーションとして、 かなりスケールできるアプリケーションを作れるようになると思います。

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

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

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

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

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

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

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

まとめ

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

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

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