24
Keeping COMET alive サササササ ササササササ

Keeping COMET alive

  • Upload
    bly

  • View
    78

  • Download
    0

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: Keeping  COMET  alive

Keeping COMET alive

Keeping COMET alive

サイボウズ・ラボ株式会社奥 一穂

Page 2: Keeping  COMET  alive

2007 2 23年 月 日 Keeping COMET Alive 2

Comet とは ?Comet とは ?

a.k.a. Ajax Pollinglong-lived stream over HTTP

代表例Lingr

やる気のない説明でごめんなさい

Page 3: Keeping  COMET  alive

2007 2 23年 月 日 Keeping COMET Alive 3

Comet とは ? (2)Comet とは ? (2)

Comet は、まだまだ未成熟な技術です道を誤ると危険 !!

シューメーカー・レヴィ第9彗星1994 年 7 月、分裂して木星に衝突

でも、今日は地上の星について話しましょう

Page 4: Keeping  COMET  alive

2007 2 23年 月 日 Keeping COMET Alive 4

目次目次

Comet vs. SpecificationsComet のプログラミングモデルまとめ & おまけ

Page 5: Keeping  COMET  alive

2007 2 23年 月 日 Keeping COMET Alive 5

Comet vs. Specifications

Page 6: Keeping  COMET  alive

2007 2 23年 月 日 Keeping COMET Alive 6

Comet vs. SpecificationsComet vs. Specifications

HTTP KeepaliveHTTP/1.1 Pipelining同時接続数の制限XHR の Same Origin Policy

Page 7: Keeping  COMET  alive

2007 2 23年 月 日 Keeping COMET Alive 7

What is Keepalive?What is Keepalive?

複数リクエストで TCP 接続を使いまわし

接続切断のオーバーヘッドがなくなるHTTP/1.0 で de-facto な仕様が出現

参考 : RFC2068

HTTP/1.1 で正式な仕様になった

Comet では、当然使いたい

Page 8: Keeping  COMET  alive

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 は未実装 ?

Page 9: Keeping  COMET  alive

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 のソース

Page 10: Keeping  COMET  alive

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 を使いたい

Page 11: Keeping  COMET  alive

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 を考えると妥当な設計 ?

結論 : ホスト名を増やすことで回避可能

Page 12: Keeping  COMET  alive

2007 2 23年 月 日 Keeping COMET Alive 12

XHR の Same Origin PolicyXHR の Same Origin Policy

XmlHttpRequest は、 location.hostport のサーバとしか交信できない

ホスト名を増やした場合の回避策 ?

Page 13: Keeping  COMET  alive

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 を大量に生成 → 同時接続数制限を回避

Page 14: Keeping  COMET  alive

2007 2 23年 月 日 Keeping COMET Alive 14

Comet のプログラミングモデル

Page 15: Keeping  COMET  alive

2007 2 23年 月 日 Keeping COMET Alive 15

Comet のプログラミングモデルComet のプログラミングモデル

C10K Problem3+1種類のプログラミングモデル

Suspend & Resume モデルQueue モデルSuspend & Push モデル独自サーバモデル

これからの課題

Page 16: Keeping  COMET  alive

2007 2 23年 月 日 Keeping COMET Alive 16

C10K ProblemC10K Problem

C10K Problemサーバで TCP 接続 10,000 本をどう扱うか ?大規模サービスの人たちは経験済

Comet では、 C10K の意味が変わるこれまで場合 : リクエスト待ち x 10KComet の場合 : 処理中のリクエスト x 10K

従来のプログラミングモデルは使えない例 : Perl インタプリタを1万個も起動したくない

メモリが 100GB くらい必要 ?

Page 17: Keeping  COMET  alive

2007 2 23年 月 日 Keeping COMET Alive 17

Suspend & Resume モデルSuspend & Resume モデル

Jetty が実装 (Jetty Continuations)手順

1. アプリケーションロジックでサスペンド宣言2. サーバが Notify or タイムアウトまで待機3. アプリケーションロジックを再実行

評価+ 従来のプログラミングモデルに近い- 負荷が高く、チャット等マルチキャストには向かない

Page 18: Keeping  COMET  alive

2007 2 23年 月 日 Keeping COMET Alive 18

Queue モデルQueue モデル

lighttpd の開発者が提案 (mod_mailbox)ウェブサーバ上に Queue を作る

アプリケーションロジックが Queue を作成&書込

ブラウザが Comet で Queue から読込Queue は自動的に expire

評価+ 負荷が低く、マルチキャストに向く- アクセス制限等の柔軟性に疑問符- スケールアウトできない

Page 19: Keeping  COMET  alive

2007 2 23年 月 日 Keeping COMET Alive 19

Suspend & Push モデルSuspend & Push モデル

cometd (reverse proxy) が実装手順

1. ウェブサーバが特殊なヘッダ (w.ID) を返す2. rproxy がレスポンス送信待ち状態に入る3. アプリケーションロジックが rproxy を経由して

(ID で指定した接続に ) レスポンスをプッシュ

評価+ 負荷が低く、マルチキャストに向く+ スケールアウト可能

Page 20: Keeping  COMET  alive

2007 2 23年 月 日 Keeping COMET Alive 20

独自サーバモデル独自サーバモデル

スケールアップを狙うならコレ無駄なオーバーヘッドが無い特定用途向け httpd の実装は難しくない

Perl 等でも、そこそこの速度が出ますC やネットワークの知識はあったほうがいい

パフォーマンスチューニングのため初心者へのオススメ : PoCo::Server::HTTPパフォーマンスがほしい人 : Sys::Syscall qw(:epol

l)

Page 21: Keeping  COMET  alive

2007 2 23年 月 日 Keeping COMET Alive 21

これからの課題これからの課題

現実的な例 : スケジュールの変更通知変更を共有メンバー (変更者を除く ) に通知したいスケジュールの追加・変更・削除…アプリケーションロジックの何ヶ所で対応が必要 ?

DB 変更をトリガーにして Push したいよね ?Push のロジックはスクリプト言語で書きたいはずDB サーバーを拡張 ?O/R マッパーで対応可能 ?

Page 22: Keeping  COMET  alive

2007 2 23年 月 日 Keeping COMET Alive 22

まとめ & おまけ

Page 23: Keeping  COMET  alive

2007 2 23年 月 日 Keeping COMET Alive 23

まとめまとめ

オススメの Comet サービス構成Comet 接続は別 hostnameiframe + XHR

プログラミングモデルは発展途上パフォーマンスを狙うなら独自サーバ

Page 24: Keeping  COMET  alive

2007 2 23年 月 日 Keeping COMET Alive 24

おまけおまけ

Comet に「新しい技術的問題」は無い問題があったとしても、 TCP/IP の歴史に答えはある

TCP で可能なことは over HTTP でも可能see SoftEther

いかに楽に Comet するかが問題なんです