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