06/11/28 21:22
今ホットなJSONPとCOMET

最近とてもホットな技術です。それぞれの言葉はGoogle等で検索するとたくさんサイトがありますので、詳しくはそちらを見ていただくとして、私が感じたことを書いてみます。COMETはコネクションを繋ぎっぱなしにして、リアルタイムでサーバーPUSHによる自動更新ができるもので、チャット等に適しています。JSONPは同一ドメインからしかXMLHttpRequest()が使えない制約を、ScriptタグでJavaScriptがドメインを超えてインクルードできることを利用して、通信できるようにしたものです。どちらも私はFlashを使わないと実装が難しいと思っていたのですが、これができるということで、JavaScripの可能性が更に広がった感じがします。
ITmediaの記事にJSONP のYahooSearchAPIを使った例がありますが、このやり方に感心してしまいました。動的にscriptタグをつくって、コールバック関数の名前を指定してAPIを呼び出し、そのレスポンスに指定したコールバック関数にデータを引数に与えた形のテキストを受信して、もともと定義してあるコールバック関数を実行するという、文章で書いてもわかりづらいですが、ここまでJavaScriptのポテンシャルがあったのかと驚きました。script属性の設定だけで実行してしまうのはIE6だけだそうですが、だれが見つけたのでしょうか。もしかしたらバグ? まあこれだけ研究されているということでしょう。枯れた技術でもここまで使い込むのを見ると、メモリ容量が少なかった時代のアクロバット的なブログラム開発を思い出します。ただこの例は自分自身を書き換えながらプログラムを実行しており、一つ間違うと危険なコードになることから、注意が必要です。
あとCOMETもエキサイティングです。従来のポーリングによる手法より大きなメリットがある技術です。このあたりの背景や実績(こういうのってとても貴重)がインフォテリアの江島氏のサイトに詳しく書かれています。ポイントはここにも書かれていますが、ソケットとプロセス(スレッド)の分離にあるようです。つなぎっぱなしだとサーバーが同時接続数分プロセス(スレッド)を持つ必要があるため、一対一対応ではだめということになります。以前Flashを使って複数のストリーミングサーバーのステータスをリアルタイム表示するクライアント/サーバーサイドのプログラム開発をしたことがあったので、なんとなくイメージができました。このときはクライアントはFlashMXを使い、アクションスクリプトのxmlsocketで通信し、サーバー側はC言語でソケット通信、マルチスレッドのコーディングをしました。スレッドなのでグローバル変数にステータスを保持し更新のたびに送信することで実現しました。ソケットとスレッドの分離ということになると、 Select関数を使ってファイルディスクリプタを監視する方法でやるのかもしません。これだと非同期ではなく同期で処理するためスレッドを使わず複数クライアントが処理できます。しかしLinuxではファイルディスクリプタの最大数がユーザーあたり1024なので、これ以上の同時接続数が必要な場合は、カーネルの制限を変更しなければならいのでしょうか。ここまでくるとちょっとわかりませんが、とても興味がある分野ですので近いうちに実験したいと思っています。
こうやってみると、AJAX,JSONとまだまだ現在進行形の技術なんだなあと実感します。私がFlashを使う動機となっていた、クロスドメイン制限とサーバーPUSH(JavaScriptだとタイムアウトが気になっていたのですが、自分で実験すればいいものの人がやってできると知ったら使うという悪いくせ)が、このような形でJavaScriptでもできるとなると、またアイディアが広がります。