Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


Presentation on theme: "Keeping COMET alive サイボウズ・ラボ株式会社 奥 一穂."— Presentation transcript:

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

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

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

4 Comet vs. Specifications Comet のプログラミングモデル まとめ & おまけ
目次 Comet vs. Specifications Comet のプログラミングモデル まとめ & おまけ 2007年2月23日 Keeping COMET Alive

5 Comet vs. Specifications
2007年2月23日 Keeping COMET Alive

6 Comet vs. Specifications
HTTP Keepalive HTTP/1.1 Pipelining 同時接続数の制限 XHR の Same Origin Policy 2007年2月23日 Keeping COMET Alive

7 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

8 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

9 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

10 複数の Comet セッションがほしいケースも 回避策は?
同時接続数の制限 HTTP の同時接続数: 2~4 A single-user client SHOULD NOT maintain more than 2 connections with any server or proxy. Practical Considerations, RFC 2616 複数の Comet セッションがほしいケースも 例: 複数のチャットルームに入る 回避策は? JSONP – セキュリティリスク or パフォーマンス劣化 やはり XHR を使いたい 2007年2月23日 Keeping COMET Alive

11 RFC2616 再訪 Server の定義とは? 結論: ホスト名を増やすことで回避可能 同時接続数の制限 (2)
A single-user client SHOULD NOT maintain more than 2 connections with any server or proxy. Practical Considerations, RFC 2616 Server の定義とは? IP アドレスではなく location.hostname 主要ブラウザ全部がそう (だったと思う…) VirtualHost や Load Balancing を考えると妥当な設計? 結論: ホスト名を増やすことで回避可能 2007年2月23日 Keeping COMET Alive

12 XHR の Same Origin Policy
XmlHttpRequest は、location.hostport のサーバとしか交信できない ホスト名を増やした場合の回避策? 2007年2月23日 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 を大量に生成 → 同時接続数制限を回避 2007年2月23日 Keeping COMET Alive

14 Comet のプログラミングモデル 2007年2月23日 Keeping COMET Alive

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

16 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

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

18 lighttpd の開発者が提案 (mod_mailbox) ウェブサーバ上に Queue を作る
ブラウザが Comet で Queue から読込 Queue は自動的に expire 評価 + 負荷が低く、マルチキャストに向く - アクセス制限等の柔軟性に疑問符 - スケールアウトできない 2007年2月23日 Keeping COMET Alive

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

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

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

22 まとめ & おまけ 2007年2月23日 Keeping COMET Alive

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

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


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

Similar presentations


Ads by Google