Keeping COMET alive サイボウズ・ラボ株式会社 奥 一穂
a.k.a. Ajax Polling 代表例 やる気のない説明でごめんなさい Comet とは? long-lived stream over HTTP 代表例 Lingr やる気のない説明でごめんなさい 2007年2月23日 Keeping COMET Alive
でも、今日は地上の星について話しましょう Comet とは? (2) Comet は、まだまだ未成熟な技術です 道を誤ると危険!! シューメーカー・レヴィ第9彗星 1994年7月、分裂して木星に衝突 でも、今日は地上の星について話しましょう 2007年2月23日 Keeping COMET Alive
Comet vs. Specifications Comet のプログラミングモデル まとめ & おまけ 目次 Comet vs. Specifications Comet のプログラミングモデル まとめ & おまけ 2007年2月23日 Keeping COMET Alive
Comet vs. Specifications 2007年2月23日 Keeping COMET Alive
Comet vs. Specifications HTTP Keepalive HTTP/1.1 Pipelining 同時接続数の制限 XHR の Same Origin Policy 2007年2月23日 Keeping COMET Alive
HTTP/1.0 で de-facto な仕様が出現 HTTP/1.1 で正式な仕様になった Comet では、当然使いたい What is Keepalive? 複数リクエストで TCP 接続を使いまわし 接続切断のオーバーヘッドがなくなる HTTP/1.0 で de-facto な仕様が出現 参考: RFC2068 HTTP/1.1 で正式な仕様になった Comet では、当然使いたい 2007年2月23日 Keeping COMET Alive
Firefox は Pipelining を実装している orz HTTP/1.1 Pipelining HTTP/1.1 の requirement Keepalive をサポートする限りにおいて 複数の HTTP リクエストを続けて送信 レイテンシの隠蔽が可能 Comet とは相性が悪い レスポンス送信待ちの接続に次のリクエストが来る Firefox は Pipelining を実装している orz デフォルト Off だけど、On にしている人も IE は未実装? 2007年2月23日 Keeping COMET Alive
How to Use Keepalive BUT NOT Pipelining やや裏技ですが… 2つの方法 HTTP/1.0 Keepalive を使う Pipeline 実装が壊れているサーバを名乗る IIS/4, IIS/5, Netscape Enterprise/3 参考: Firefox のソース 2007年2月23日 Keeping COMET Alive
複数の Comet セッションがほしいケースも 回避策は? 同時接続数の制限 HTTP の同時接続数: 2~4 A single-user client SHOULD NOT maintain more than 2 connections with any server or proxy. -- 8.1.4 Practical Considerations, RFC 2616 複数の Comet セッションがほしいケースも 例: 複数のチャットルームに入る 回避策は? JSONP – セキュリティリスク or パフォーマンス劣化 やはり XHR を使いたい 2007年2月23日 Keeping COMET Alive
RFC2616 再訪 Server の定義とは? 結論: ホスト名を増やすことで回避可能 同時接続数の制限 (2) A single-user client SHOULD NOT maintain more than 2 connections with any server or proxy. -- 8.1.4 Practical Considerations, RFC 2616 Server の定義とは? IP アドレスではなく location.hostname 主要ブラウザ全部がそう (だったと思う…) VirtualHost や Load Balancing を考えると妥当な設計? 結論: ホスト名を増やすことで回避可能 2007年2月23日 Keeping COMET Alive
XHR の Same Origin Policy XmlHttpRequest は、location.hostport のサーバとしか交信できない ホスト名を増やした場合の回避策? 2007年2月23日 Keeping COMET Alive
XHR の Same Origin Policy (2) 回避策: Iframe + XHR Iframe の場合は、document.domain を変更することで、異なるサブドメインのフレーム間交信が可能 例: サービスの URL は chatservice.yy iframe に xxx.chatservice.yy をロード iframe 内から xxx.chatservice.yy に XHR xxx を大量に生成 → 同時接続数制限を回避 2007年2月23日 Keeping COMET Alive
Comet のプログラミングモデル 2007年2月23日 Keeping COMET Alive
C10K Problem 3+1種類のプログラミングモデル これからの課題 Comet のプログラミングモデル Suspend & Resume モデル Queue モデル Suspend & Push モデル 独自サーバモデル これからの課題 2007年2月23日 Keeping COMET Alive
C10K Problem Comet では、C10K の意味が変わる 従来のプログラミングモデルは使えない C10K Problem サーバで TCP 接続 10,000 本をどう扱うか? 大規模サービスの人たちは経験済 Comet では、C10K の意味が変わる これまで場合: リクエスト待ち x 10K Comet の場合: 処理中のリクエスト x 10K 従来のプログラミングモデルは使えない 例: Perl インタプリタを1万個も起動したくない メモリが 100GB くらい必要? 2007年2月23日 Keeping COMET Alive
Jetty が実装 (Jetty Continuations) 手順 Suspend & Resume モデル Jetty が実装 (Jetty Continuations) 手順 1. アプリケーションロジックでサスペンド宣言 2. サーバが Notify or タイムアウトまで待機 3. アプリケーションロジックを再実行 評価 + 従来のプログラミングモデルに近い - 負荷が高く、チャット等マルチキャストには向かない 2007年2月23日 Keeping COMET Alive
lighttpd の開発者が提案 (mod_mailbox) ウェブサーバ上に Queue を作る ブラウザが Comet で Queue から読込 Queue は自動的に expire 評価 + 負荷が低く、マルチキャストに向く - アクセス制限等の柔軟性に疑問符 - スケールアウトできない 2007年2月23日 Keeping COMET Alive
cometd (reverse proxy) が実装 手順 Suspend & Push モデル cometd (reverse proxy) が実装 手順 1. ウェブサーバが特殊なヘッダ (w.ID) を返す 2. rproxy がレスポンス送信待ち状態に入る 3. アプリケーションロジックが rproxy を経由して (ID で指定した接続に) レスポンスをプッシュ 評価 + 負荷が低く、マルチキャストに向く + スケールアウト可能 2007年2月23日 Keeping COMET Alive
スケールアップを狙うならコレ Perl 等でも、そこそこの速度が出ます 独自サーバモデル 無駄なオーバーヘッドが無い 特定用途向け httpd の実装は難しくない Perl 等でも、そこそこの速度が出ます C やネットワークの知識はあったほうがいい パフォーマンスチューニングのため 初心者へのオススメ: PoCo::Server::HTTP パフォーマンスがほしい人: Sys::Syscall qw(:epoll) 2007年2月23日 Keeping COMET Alive
DB 変更をトリガーにして Push したいよね? これからの課題 現実的な例: スケジュールの変更通知 変更を共有メンバー (変更者を除く) に通知したい スケジュールの追加・変更・削除… アプリケーションロジックの何ヶ所で対応が必要? DB 変更をトリガーにして Push したいよね? Push のロジックはスクリプト言語で書きたいはず DB サーバーを拡張? O/R マッパーで対応可能? 2007年2月23日 Keeping COMET Alive
まとめ & おまけ 2007年2月23日 Keeping COMET Alive
オススメの Comet サービス構成 プログラミングモデルは発展途上 パフォーマンスを狙うなら独自サーバ まとめ Comet 接続は別 hostname iframe + XHR プログラミングモデルは発展途上 パフォーマンスを狙うなら独自サーバ 2007年2月23日 Keeping COMET Alive
いかに楽に Comet するかが問題なんです おまけ Comet に「新しい技術的問題」は無い 問題があったとしても、TCP/IP の歴史に答えはある TCP で可能なことは over HTTP でも可能 see SoftEther いかに楽に Comet するかが問題なんです 2007年2月23日 Keeping COMET Alive