「ネギ振りカウンタ」から学ぶmixiアプリ運用
基本に立ち戻り、負荷対策
まずは基本に立ち戻り、原因の切り分けから始めました。RRDtoolで出力している自宅サーバーの負荷グラフを見てみたところ、まだ若干の余裕がありました。内部ネットワークにも問題ありません。しかし、外部ネットワークへのパケットが大量に遅延していました。自宅サーバーでの運営で大量のリクエストを裁く上で問題だったのは、サーバー負荷よりもルータ性能の限界だったのです。モバツイの作者として有名なえふしんさんのエントリーでも述べられていますが、この規模のアクセスに対しては、1万円程度の民生用ルータでは全く歯が立ちません。
Webサービスで最初にボトルネックになってくるのは大量のリクエストです。ネギ振りはmixiアプリの表示ビューの中でもっともPV数が多いhome.plに表示されるという特性上、大量のリクエストが発生していました。
Webサービスの負荷対策といえばYahoo Inc.が公開しているHigh Performance Web Sitesです。手法自体は負荷対策としては一般的なものばかりですが、それぞれの手法による効果を実際に計測して効果のあるものに集約し、負荷対策の余地があるかどうかを計測できるYSlowというソフトウェアまで公開したため、公開されるやいなや多くのWebサービスに影響を与えました。日本語にも訳され、「ハイパフォーマンスWebサイト」「続・ハイパフォーマンスWebサイト」という書籍にもなっているので一度読んでみるといいでしょう。
ハイパフォーマンスWebサイト ―高速サイトを実現する14のルール
続・ハイパフォーマンスWebサイト ―ウェブ高速化のベストプラクティス
ハイパフォーマンスWebサイトの実現に向けて
ハイパフォーマンスWebサイトのルールには以下の14個があります(注:2010年8月現在、追加されたものを含め全35ルールが公開されている→参照ページ)。
- HTTPリクエストを減らす
- CDN(Content Delivery Network)を使う
- Expiresヘッダーを設定する
- コンポーネントをgzip化する
- スタイルシートは先頭に置く
- スクリプトは最後に置く
- CSS expressionの使用を控える
- JavaScriptとCSSは外部ファイル化する
- DNSルックアップを減らす
- JavaScriptを縮小化する
- リダイレクトを避ける
- スクリプトを重複させない
- ETagの設定を変更する
- Ajaxをキャッシュ可能にする
第1章でリクエスト数が多すぎてルータが限界に達していることが分かってたので、まずはリクエストを減らすことを考えます。「ルール1:HTTPリクエストを減らす」です。
ネギ振りはmixiにログインして最初にアクセスされるページであり、mixiアプリの表示ビューの中でももっともPV数が多いhome.plに表示されるので、ネギ振りを使おうとしていないユーザーからもリクエストが飛んできていることになります。これを軽減させるためには、ネギ振りを使わないユーザーにはコンテンツを表示しないで、実際に必要になってからローディングするような設定が一番です。いわゆる遅延ローディングです。
ネギ振りは現在のカウント数の取得に遅延ローディングを使うことにしました。試しにonloadイベントが発行されてから数秒後に現在のカウント数を取得するリクエストを発行するようにして、ネギ振りの連打を検知して数秒待ってからリクエストを送るようにしたところ、リクエスト数が 1/20以下に激減しました。もちろんユーザーエクスペリエンスを損なっては意味が無いので、ローディング中でもネギを振れるようにしてネギを振ればすぐに最新のカウントに更新されるようにしました。homeガジェットは1画面内に入らないため、ユーザーが待たされていることを意識されない作りになっています。
もちろん、この方法はrun_appli.plではあまり効果的とは言えません。遅延ローディングが効いてくるのは、遷移しないで1ページにたくさんの機能を持たせる場合や、ページの主なコンテンツ以外の部分(サイドバー、フッターなど)に使う場合だけです。
HTTPリクエストを減らすというのは、一回の表示で読み込まれるファイル数を減らすのと同じ意味です。JSファイルやCSSファイルを結合したり、画像ファイルを結合してCSS Spriteで表示する方法もあります。細かい大量の画像を配信しているサイトになるとかなり効果がありますが、ネギ振りは一回に読み込まれるコンテンツがもともと少ないので結合はしませんでした。
また、第3回でも解説したPersistence APIというアプリのデータを永続化させるAPIを使うことで、自分のサーバーを使わずにmixi側で保存もできます。
詳細情報:mixi Developer Center「情報を共有してみよう」
今回はPersistenceAPIを使っていませんが、ユーザーの設定などサーバーに問い合わせる必要のないデータは、できるだけmixi側に永続化させることでサーバーへのリクエスト自体を減らせます。