パフォーマンスの確認
RailTrackrのユーザーサイドの機能はこれで完成です。しかし、多くの写真をダウンロードして処理するリソース負荷の高いアプリケーションでは、スムーズな操作を実現するためにパフォーマンスが極めて重要になります。
Rails 2.0では、全体的なパフォーマンスに対するさまざまな改善が盛り込まれ、アプリケーションを高速化するための高度な手法がサポートされています。特に重要なものは次のとおりです。
- JavaScriptバンドル機能
- Cookieベースのセッション
- ドメインのマルチターゲット機能
- クエリキャッシュ機能
JavaScriptバンドル機能
JavaScriptバンドル機能とは、アプリケーションのすべてのJavaScriptファイル(またはその一部)を1つのファイルにまとめてからクライアントに送信する機能です。現在、Webアプリケーションは多くのJavaScriptライブラリを使ってユーザーエクスペリエンスを向上させ、リッチなビジュアル効果を提供しています。一方で、ブラウザは1つのJavaScriptライブラリを取得するたびに複数の要求を実行しなければならないため、パフォーマンスが低下するという欠点もあります。ライブラリすべてを1つにまとめることで、ブラウザは1つの要求しか実行する必要がなくなり、Rails 2.0はJavaScriptファイルを迅速に提供できるようになりました。
RailTrackrも同じです。凝った効果を提供するには多くのJavaScriptファイルが必要です。比較のため、あるユーザーのすべてのフォトセットを含むページにJavaScriptバンドル機能を使わずにアクセスした場合の所要時間(図6)と、JavaScriptバンドル機能を使った場合の所要時間(図7)を示します。レポートの作成にはFirebugを使いました。


JavaScriptバンドル機能のアクティブ化は極めて簡単です。次のように、ビューテンプレート内のjavascript_include_tagステートメントに:cache属性を追加するだけです。
<%= javascript_include_tag
"prototype" , "effects" , "dragdrop" , "instant" , "reflex" ,
:cache => "railtrackr" %>
<!-- Will create a single railtrackr.js file -->
同じ手法はスタイルシートのバンドルにも適用できます。この場合は、stylesheet_include_tagコマンドを使います。
バンドル機能は、Railsが実稼動モードになると有効になり、開発中は無効なので、開発者のデバッグセッションでわずらわしさを感じることがありません。
Cookieベースのセッション
パフォーマンス向上が期待できるもう1つの理由は、Rails 2.0では、セッションデータを保管するときに、サーバー上のデータベースファイルや一時ファイルではなく、ブラウザのCookieを使用することです。ステート情報はすべてクライアント上に残るので、アプリケーションはステートレスに動作でき、水平方向のスケーラビリティによってパフォーマンスが向上します。必要に応じて、サーバーを追加して、各サーバーでまったく同じアプリケーションを実行させることで、レプリカ間でのセッションデータの同期を気にせずに、スループットを向上させることもできます。RailsはCookieにセッションデータを格納するときに暗号化を行いますが、それでも、このソリューションを用いて機密データをセッションに格納したり、セッションに巨大なオブジェクトを格納したりすることは避けてください。なぜなら、ブラウザは要求のたびにCookieをサーバーに送り返すからです(そのため、Cookieは軽量でなければなりません)。
ドメインのマルチターゲット機能
最近のブラウザは、一般的に、アクセスしている各ドメインに対して2つの同時接続だけを開きます。RailTrackrのページには多くの画像が収められているので、これではブラウザがすべての要求をキューに入れてしまいパフォーマンスが低下します。次のステートメントを指定すると、Railsはドメインのマルチターゲット機能をアクティブにし、複数のドメインに分散された静的なリソースのURLを生成します(デフォルトは4つで、%d記号が数字0~3に置き換えられて、名前が作成されます)。
ActionController::Base.asset_host = "static%d.yoursite.com"
ブラウザは同時に2つではなく8つの画像をダウンロードします。この変更をアクティブにするには、まずドメインでDNS別名を設定する必要があります。
クエリキャッシュ機能
Rails 2.0には、このほかにもデータベース層のパフォーマンス向上を実現するための機能がいくつか用意されています。たとえばクエリキャッシュ機能では、1つの要求を処理するときに同じクエリを何度も実行することを回避できます。
