先週末に予定されていたJTPA企画の梅田さん主催オンラインサロンですが、会場に多くの人が集まるにつれてLingrが重くなってしまうという事態に陥ってしまい、まるでイベントの体をなさないまま時間が過ぎてしまい、あえなく中止となってしまいました。
当イベントを楽しみにしていた皆様、そして梅田さんはじめJTPAスタッフの方々には、本当に申し訳なかったと思います。ここに改めてお詫び申し上げます。
Macworld 2007のときには180人を収容して何の問題もなく快適に使えていたので、「1000人はわからないけど、200人ぐらいなら大丈夫だろう」とたかをくくっていたのが間違いでした。
今回はその反省も含めて、内部で検証した技術情報をすべて公開し、どのような問題に直面し、どのように解決にあたっているのかをお伝えすることで、特に技術者の皆さんに役立つフィードバックにしたいと思います。
■今回のアーキテクチャの変更について
まず前提としてご理解いただきたいのは、Lingrはインスタントメッセンジャーのような1対1の通信ではなく、1つのイベントが発生するごとにN人に一斉配信しなければいけない=N人全員の状態を同期させなければならないIRC型のアーキテクチャなので、ひとつのルームに参加する人数が増えると単純増加ではなくて級数的に問題が大きくなるということです。
すごく単純化して言えば、あるルームへの参加者N人中の1人あたりの平均的な信頼性を R (0<R<1) とすると、ルームの信頼性 = RN という感じで急速に信頼性が減衰していくモデルです。
これはComet技術を採用することによる「大量の開けっ放しコネクション問題」を乗り越えた他の企業、たとえば Google (GTalk in Gmail) や Meebo でさえも解いたことがない、まったく新しい種類の技術的な問題だといえます。
上記をふまえて、今回の現象を理解する前提として、1月25日のリリースで行われたバックエンドのアーキテクチャ変更についてご説明したいと思います。
新しいアーキテクチャの図はこちら。
主な変更点としては、
これらの変更点は、すべてAPIでアプリケーションを開発しやすくするために行った変更でした。pingがなくなることでクライアント側ではタイマー処理がまるまるひとつ不要になり、getがなくなることで、クライアント側でリダイレクトをハンドリングする必要なくなり、とてもシンプルなループを書けばすむようになりました。
ところが、今回発生した問題は以下のようなものでした。
もうこうなってしまうと何が起きても不思議ではありません。
アーキテクチャの変更前は、getはブラウザからWeb Serverへ直に要求されていたので、少なくともChat Serverがgetによってブロックされ、それがデッドロックを引き起こすという問題は起きたことがありませんでした。
他にもいくつか小さな問題点はあるのですが、一番クリティカルなのは上記の問題でした。とにかくgetストーム状態に落ち込んだらどうにも打つ手がありません。
これに対応するために、現在ダニーが取り組んでいるのは以下の方法です。
上記もまだ、仮説と実装と検証を繰り返す過程にあるので、最終的にどうなるかはわかりません。
他にも、
などなど、付随する小さな問題はいくつも考えられるのですが、どれもgetストーム問題によるデッドロックがroot causeであり、これさえ解決されれば自然と解消する問題なので、こいつから順番にやっつけているところです。
あとは Hot Rooms / Hot Tags の計算でボトルネックになっていたrecent messagesのカウントをmemcachedにキャッシュしたり、可能なところではどんどんフラグメント・キャッシュを使ったり、Railsを1.2.1に上げることでルーティングまわりが若干速くなったりと、パフォーマンスの改善については総合的な見直しを進めています。
近いうち、予行演習をかねて何かIT関連のネタでチャットイベントをやるかも知れません。そのときにはまた改めて告知させていただきますので、よろしくおねがいします!
♪ 中島美嘉 / 見えない星 (日テレ系水曜ドラマ「ハケンの品格」主題歌:大学時代からの親友・長瀬弘樹が作詞作曲を担当しました。おめでとう!)
※このエントリは CNET Japan ブロガーにより投稿されたものです。シーネットネットワークスジャパン および CNET Japan 編集部の見解・意向を示すものではありません。
ごろくま on 2007/02/08
hyoshiokさん、ありがとうございます。いただいたエントリを読んで、オラクルでパフォーマンスチューニングとベンチマークに明け暮れていた頃を懐かしく思い出しました。。。今回の件は、アプリケーションレベルで取っていたログでプロファイリングを行って、問題点については正しく把握できたと考えています。これから着実に手を打っていきたいと思います。
kenn on 2007/02/07
hyoshiok on 2007/02/06
Chat ServerはなるべくDumb Serverになるようにしています。ほぼすべてのロジックとデータ生成はRails側で処理し、Chat Serverは単なるコネクションパーキング兼土管。これは、同一のnotify電文をブロードキャストするだけでクライアントがChat Server Clusterのどのマシンにぶらさがっていようが届くようにするためで、現時点のアーキテクチャにおいてスケーラビリティを確保するための肝になっています。仮にJettyをちょっと賢くして全Roomオブジェクトを持たせたとしても、Eventテーブルを引っ張るには結局Rails側に行かないと取り出せないので、本質的な解決になりえないのです。残念ながら。
kenn on 2007/02/06
読んでいて疑問に思った箇所があるので脊髄反射的なコメントです。
「3.あまりに多くのクライアントがgetを要求するため、Chat Serverの全ワーカースレッドがgetをWeb Serverに対して発行した状態でブロックされる。」
ここの部分について、Chat Server上にはRoomオブジェクトみたいなものは存在しないのでしょうか?もし、Roomオブジェクトが存在して、Web ServerからのイベントをRoomオブジェクト経由でRoom参加者に配信する形でしたら、Room上でイベントをキャッシュしてObserver接続時にRoom自身がキャッシュからイベントを配信することで Web Serverへのgetを減らせそうな気がするのですが……。
nak2k on 2007/02/06
ブログにコメントするにはCNET_IDにログインしてください。
この記事に対するTrackBackのURL:
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
ネットワーク型産業構造への衣替え?
iPhonista Nightの事後報告
オトナになるということ
福祉国家の失敗〜40年前の「断絶の時代」を読む(3)
公共団体のMSへの依存A会津若松市や島根に勇気!!
さあ来い!Silverlight 2
シュワ
オンライン広告は2012年に2兆円市場にーリーマンブラザース予測
「VMware Fusion 2.0」にて利用可能な「Automator」アクションみんなのお題では、ブロガー同士で質問を出し合いそれに対する回答や意見を集めています。今日はどんな話題が盛り上がっているでしょう?
エンタメCGM「gooメーカー☆メーカー」CNET Japan ブログネットワークは、元はCNET Japanの一読者であった読者ブロガーと、編集部の依頼により執筆されているアルファブロガーたちが、ブログを通じてオンタイムに批評や意見を発信する場である「オピニオンプレイス」、また、オピニオンを交換するブロガーたちが集うソサエティです。
広い視野と鋭い目を持ったブロガーたちが、今日のIT業界や製品に対するビジョンや見解について日々熱く語っています。
CNET Japanやその他サイトが提供するITニュースやコンテンツへの意見や分析、 ビジネスやテクノロジーに対するビジョンや見解について語っていただける方を 募集しています。ご応募はこちらから
ブログの投稿はこちらから(※ブロガー専用)
今年最も活躍したブロガーを表彰します。詳細はこちらから
これは、CNET Japan 編集部の依頼に基づいて執筆されているCNET Japan アルファブロガーによるブログの印です。
CNET Japan ブログネットワーク内で拍手の代わりに使用する機能です。ブログを読んで、感激した・役に立ったなど、うれしいと思ったときにクリックしてください。多くGood!を獲得した記事は、より多くの人に読まれるように表示されます。
今週の新製品総チェック:新PS3が登場!ニコンが発表した映像製品「UP」とは?
[レビュー]2011年画質を備えた高画質、多機能Blu-ray--ソニー「BDZ-X95」
今週の新製品総チェック:よりモバイルPCとして進化した「Let's note」が登場
今週の新製品総チェック:フルサイズCMOS搭載のキヤノン「EOS 5D Mark II」が登場
今週の新製品総チェック:第4世代iPod nano登場、ソニー「α」、松下「LUMIX」に新機種も
過去幾つかの event-id 毎に、送るべきデータ(最新状態との差分?)をサーバで生成しておいて返してやるようにすれば負荷が軽くなるのではないでしょうか。
(クライアント毎ではなくイベント発生毎に生成するのでクライアントが増えても負荷は変わらない)
これである程度の取りこぼしを許容できるので「リアルタイムにイベントを受け取れるクライアントがいなくなり、全員がgetモードへと移行する」というのが救えるはず。これと似たような仕組みを普通の周期読み込みで最近実装しました。Cometだったらわざとイベント通知を間引いて負荷調整ができたりするかも知れませんね。参考になれば幸いです。