C10K

なんかいろいろ読んでもやもやしたんで,自分なりにまとめてみたんですがやっぱりもにゃもにゃしたままです,すいません。

  1. 沢山の人がアクセスすると大変だよ(C10K)
    1. 特にチャットとかだと人数以上にリソース食って大変だよ
  2. Ajax 使ったり,通信モデルを Comet とかにするとマシになることがあるよ
  3. でも愚直に Apache + 現状の定番的な App サーバで実装するとリソース食って大変だよ
  4. Comet の場合,古典的な実装モデルより Continuation や event driven なモデルにするとリソース食わないよ
  5. チャットの場合は Comet + 新モデルでうまく解決できました(ぱちぱち)
  6. その他 C10K なこともなんらかの手段で解決できるといいよね

1-1

これがどのぐらい深刻な問題かと言うと、1000ユーザが同時接続している状態で、1秒に1度の間隔でポーリングを行うと、計算してみるとわかりますが月間で26億ヒットとなり、「なにもせずブラウザを開いているだけで」グーグルのページビュー(12億)を超えるアクセス(!!)が殺到することになります。恐ろしいですね。

3

さて、Cometならせわしない1秒に1度のアクセス・ラッシュを回避でき、必要なときだけアクションを起こすという経済的なプロトコルになるので、万事一件落着でしょうか?ところが、そうは問屋が卸しません。今度は、サーバ側に問題が発生します。 通常、Apacheなどの一般的なウェブサーバは、短い応答時間で返せる処理を大量にこなすというスループット重視の前提で設計されています。このため、リクエストを受けたらそのリクエストに対してプロセスまたはスレッドをあてがい、最後まで面倒を見るという方式が一般的です。 ところが、先ほども言ったようにCometではコネクションはつなぎっぱなしになっていますから、いつまで経ってもプロセスやスレッド(およびメモリ資源)が解放されません。しかも、それらのスレッドは仕事もせずにアイドリングしており、メモリとCPUを浪費しているだけです。これは重大な問題です。どのぐらい重大かというと、そもそも千や万のオーダーの同時接続を実現することができません。

6

@IT の件の元記事は発端が Ajax チャットなので「じゃあこれ使えばいいじゃん」という話にはなるんだろうけど、これはあくまで Comet のような実装に対しての限定的なソリューションであって、依然として C10K というか、大量コネクションに対してバックエンドのアプリケーションサーバーをどうスケーラブルにするかという問題はウェブアプリケーション開発のノウハウの中心の一つじゃないかなあと思う。

私感

ほとんどエジケンさんからの引用になってしまいました。

元記事の人は上でいう 3,6 あたりを書いていて,id:yamaz さんは 3 するなら 4 とか常識だろ,と噛みついているように読めました。むろん「2007-01-10」が間違っているというわけではないんですが*1

(2007/01/15 追記)id:yamaz さんは元記事自体をうんぬんしようとしたわけではなく,あれをきっかけとして C10K とその対策にまつわる都市伝説を払拭しようという意図だったぽいです。フォローアップ記事にてより詳細に解説なさってます。

個人的には元記事読んでも「知ったかが嘘吐いてる*2」というほどネガティブな印象はなかったです。むしろプログラマでもないライターさんが書いていること自体にびっくりしました(もちろん免罪符にはならないですが)。

おまけ(Comet with POE)

POE、とあるけど、このタイプの実装ができる PoCo だとどれだろう。PoCo::Server::HTTP の RC_WAIT と continue() を使う実装だと、結局アプリケーションサーバーがコネクションを繋ぎっぱなしな実装になるように思うけれど。

POE がよく例示されるのは,POE だと疑似マルチタスクなので fork するよりはマシだろうし,CPU 時間食わずに黙ってブロックされててくれるし,(疑似)タスク*3間でイベント投げれるし,Comet 向きだよね,って理由じゃないかなぁと思います。なので,とりあえずは,アプリサーバがコネクションを繋ぎぱなしでもいいんじゃないですか。これが単体で 10K を越えてスケールするかというと無理な気がしますが。

さらにおまけ

自分で Comet でチャット作ったときいろいろ試したんですが,IEFirefox のどちらか(たしか IE)だと,同一サーバの別ポート宛に XMLHttpRequest を投げられたような感じでした。みんなそうならちょっとは分業しやすいんですけどね。

(2007/01/15 追記)id:tociyuki さんによるとやっぱ IE 6 だと別ポート OK だったぽいです(⇒Cometの書き込み要求は別Port、あとは…… - Tociyuki::Diary)。

*1:誤解 4 とか知らなかったです。勉強になりました。

*2:別に id:yamaz さんがそういってるわけではなくて,元記事のブクマコメントを見た感じネガティブなコメントがわりと目についたので極論として書いてみました

*3:POE 用語的にはセッション