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