1 / 24

Keeping COMET alive

Keeping COMET alive. サイボウズ・ラボ株式会社 奥 一穂. Comet とは ?. a.k.a. Ajax Polling long-lived stream over HTTP 代表例 Lingr やる気のない説明でごめんなさい. Comet とは ? (2). シューメーカー・レヴィ第9彗星 1994 年 7 月、分裂して木星に衝突. Comet は、まだまだ未成熟な技術です 道を誤ると危険 !!. でも、今日は地上の星について話しましょう. 目次. Comet vs. Specifications

bly
Download Presentation

Keeping COMET alive

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Keeping COMET alive サイボウズ・ラボ株式会社 奥 一穂

  2. Comet とは? • a.k.a. Ajax Polling • long-lived stream over HTTP • 代表例 • Lingr • やる気のない説明でごめんなさい Keeping COMET Alive

  3. Comet とは? (2) シューメーカー・レヴィ第9彗星 1994年7月、分裂して木星に衝突 • Comet は、まだまだ未成熟な技術です • 道を誤ると危険!! でも、今日は地上の星について話しましょう Keeping COMET Alive

  4. 目次 • Comet vs. Specifications • Comet のプログラミングモデル • まとめ & おまけ Keeping COMET Alive

  5. Comet vs. Specifications Keeping COMET Alive

  6. Comet vs. Specifications • HTTP Keepalive • HTTP/1.1 Pipelining • 同時接続数の制限 • XHR の Same Origin Policy Keeping COMET Alive

  7. What is Keepalive? • 複数リクエストで TCP 接続を使いまわし • 接続切断のオーバーヘッドがなくなる • HTTP/1.0 で de-facto な仕様が出現 • 参考: RFC2068 • HTTP/1.1 で正式な仕様になった • Comet では、当然使いたい Keeping COMET Alive

  8. HTTP/1.1 Pipelining • HTTP/1.1 の requirement • Keepalive をサポートする限りにおいて • 複数の HTTP リクエストを続けて送信 • レイテンシの隠蔽が可能 • Comet とは相性が悪い • レスポンス送信待ちの接続に次のリクエストが来る • Firefox は Pipelining を実装している orz • デフォルト Off だけど、On にしている人も • IE は未実装? Keeping COMET Alive

  9. How to Use Keepalive BUT NOT Pipelining • やや裏技ですが… • 2つの方法 • HTTP/1.0 Keepalive を使う • Pipeline 実装が壊れているサーバを名乗る • IIS/4, IIS/5, Netscape Enterprise/3 • 参考: Firefox のソース Keeping COMET Alive

  10. 同時接続数の制限 • 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

  11. 同時接続数の制限 (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

  12. XHR の Same Origin Policy • XmlHttpRequest は、location.hostport のサーバとしか交信できない • ホスト名を増やした場合の回避策? Keeping COMET Alive

  13. 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

  14. Comet のプログラミングモデル Keeping COMET Alive

  15. Comet のプログラミングモデル • C10K Problem • 3+1種類のプログラミングモデル • Suspend & Resume モデル • Queue モデル • Suspend & Push モデル • 独自サーバモデル • これからの課題 Keeping COMET Alive

  16. C10K Problem • C10K Problem • サーバで TCP 接続 10,000 本をどう扱うか? • 大規模サービスの人たちは経験済 • Comet では、C10K の意味が変わる • これまで場合: リクエスト待ち x 10K • Comet の場合: 処理中のリクエスト x 10K • 従来のプログラミングモデルは使えない • 例: Perl インタプリタを1万個も起動したくない • メモリが 100GB くらい必要? Keeping COMET Alive

  17. Suspend & Resume モデル • Jetty が実装 (Jetty Continuations) • 手順 1. アプリケーションロジックでサスペンド宣言 2. サーバが Notify or タイムアウトまで待機 3. アプリケーションロジックを再実行 • 評価 + 従来のプログラミングモデルに近い - 負荷が高く、チャット等マルチキャストには向かない Keeping COMET Alive

  18. Queue モデル • lighttpd の開発者が提案 (mod_mailbox) • ウェブサーバ上に Queue を作る • アプリケーションロジックが Queue を作成&書込 • ブラウザが Comet で Queue から読込 • Queue は自動的に expire • 評価 + 負荷が低く、マルチキャストに向く - アクセス制限等の柔軟性に疑問符 - スケールアウトできない Keeping COMET Alive

  19. Suspend & Push モデル • cometd (reverse proxy) が実装 • 手順 1. ウェブサーバが特殊なヘッダ (w.ID) を返す 2. rproxy がレスポンス送信待ち状態に入る 3. アプリケーションロジックが rproxy を経由して (ID で指定した接続に) レスポンスをプッシュ • 評価 + 負荷が低く、マルチキャストに向く + スケールアウト可能 Keeping COMET Alive

  20. 独自サーバモデル • スケールアップを狙うならコレ • 無駄なオーバーヘッドが無い • 特定用途向け httpd の実装は難しくない • Perl 等でも、そこそこの速度が出ます • C やネットワークの知識はあったほうがいい • パフォーマンスチューニングのため • 初心者へのオススメ: PoCo::Server::HTTP • パフォーマンスがほしい人: Sys::Syscall qw(:epoll) Keeping COMET Alive

  21. これからの課題 • 現実的な例: スケジュールの変更通知 • 変更を共有メンバー (変更者を除く) に通知したい • スケジュールの追加・変更・削除… • アプリケーションロジックの何ヶ所で対応が必要? • DB 変更をトリガーにして Push したいよね? • Push のロジックはスクリプト言語で書きたいはず • DB サーバーを拡張? • O/R マッパーで対応可能? Keeping COMET Alive

  22. まとめ & おまけ Keeping COMET Alive

  23. まとめ • オススメの Comet サービス構成 • Comet 接続は別 hostname • iframe + XHR • プログラミングモデルは発展途上 • パフォーマンスを狙うなら独自サーバ Keeping COMET Alive

  24. おまけ • Comet に「新しい技術的問題」は無い • 問題があったとしても、TCP/IP の歴史に答えはある • TCP で可能なことは over HTTP でも可能 • see SoftEther • いかに楽に Comet するかが問題なんです Keeping COMET Alive

More Related