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