Google App EngineのChannel APIのシンプルなサンプル

Google App EngineのChannel APIを使ったサービスをつくってみたので、技術的なことを記録しておこうと思います。私が書くのはPythonの方です。

まだ一般公開はされていませんが、SDKでは動作します。ただしSDKの動作と、GAEの実際ではChannel APIの実装が違うようで、SDKだとばんばんポーリングしてるように見えますが気にしなくてもよさそう。GAEの環境にデプロイするとロングポーリングみたいになります。

ドキュメントは?

Channel API Overview (Python) – Google App Engine – Google Code

コードは?

簡単です。まずはサーバー側。
サーバー側とクライアント側で対になるclient_idとtokenが必要になります。

client_idは任意の文字列です。clientごとに一意になるようにします。私はuuidで作成しました。JavaScript側で作成しても良いと思います。create_channel関数にclient_idを渡すことで、tokenを取得できます。

from google.appengine.api import channel
token = channel.create_channel(client_id)

tokenは、ブラウザに渡してjavascriptで使用します。
client_idはサーバーで保持しておかなければなりません。SeatNextではmemcacheを使って保持しています。クライアントを識別する場合には、tokenとclient_idを関連付けて保持します。

サーバ側からプッシュメッセージを送る際には、先程のclient_idを使って、文字列messageを送信できます。

channel.send_message(client_id, message)

複数のクライアントに配信する場合は、保持していたclient_idを使って繰り返しsend_messageをします。

そしてクライアント側。
Channel API用のJavaScriptファイルを読み込んでおく必要があります。

<code><script type="text/javascript" src="/_ah/channel/jsapi"></script></code>

JavaScriptのコードではまずChannelオブジェクトを生成します。生成するときにサーバー側で生成したtokenを引数に使用します。

var channel = new goog.appengine.Channel(token);
var socket = channel.open();    //open

//receive message handler
socket.onmessage = function(message){
  console.log(message);
};

Channelはサーバーからのプッシュを受信するだけに使用します。このChannelから送信することは出来ません。
その代わりにAjaxで送信します。おくってきたクライアントを識別する必要がある場合は、tokenを一緒に送信する必要があります。そうしたときには、サーバー側でtokenとclient_idの両方を関連付けて持ってないといけないです。

SeatNextでは、クライアントの編集操作をAjaxでサーバーに送信し、それを今度は同じ座席表を見ているクライアントにプッシュで配信して同じ操作を再現しています。

Google App Engineで使うには?

現状ではまだ一般公開してないので公開を待つか(もうすぐと言われ続けてる)、Channel API Trusted Testerに招待される必要があります。
Channel API Trusted Testerになる方法は正式な方法はよく分かりませんが、リクエストフォームみたいなのがどこかにあったと思います。私はGoogle Developer Daysの時にお会いしたGAE開発者の方にメールして申請理由などのやりとりをしたら招待していただけました。

2010/12/03追記:
記事した直後にGoogle App Engine SDK 1.4が公開されて、Channel APIが正式サービスになりました!
当初書いた記事と用語が大きく変わっていたので修正しました。

他にも考慮すべき点はいくつかありますが、一番のコアになる部分について記述しました。


Google App EngineのChannel APIのシンプルなサンプル」への2件のフィードバック

  1. オンラインチャットの実装にGAEを検討中でchannel APIをつかっていたところでしたので、非常に参考になりました!ありがとうございます!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

This site uses Akismet to reduce spam. Learn how your comment data is processed.