サイボウズ・ラボ 会社紹介

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