鮮度によるセグメンテーション
2008年6月24日
メディアウェブサイトにおける最大の課題の一つは、大量のトラフィックに対処することです。メディアは注目を集めることがすべてですが、一度にアクセスが集中しすぎると、パフォーマンスの低下が問題を引き起こし、評判を損なう可能性があります。この問題は、Webトラフィックのバースト的な性質によって悪化します。管理可能なペースで進んでいたとしても、大きなニュース記事が掲載されると、大きなスパイクが発生します。当社のクライアントの1つでは、数分で2桁のオーダーのスパイクが見られました。
同じ情報へのアクセスを高速化するための一般的なコンピューティングの解決策は、キャッシュを使用することです。私のホームページへのリクエストを繰り返すと、Webサーバーはメモリにキャッシュを構築するため、繰り返しのリクエストはディスクに触れることを回避できます。
このページは、私のサイト全体と同様に、完全に静的なため、私のウェブサイトのキャッシュを保持するのは簡単です。しかし、ほとんどのメディアサイトには、動的なコンテンツがたくさん含まれています。一般的な新聞のウェブサイトにはビジネスロジックはあまりないと思うかもしれませんが、広告リンク、関連ストーリー、特集などを調べ始めると、状況は非常に面白くなります。フランスへの旅行の記事は、フランス料理の記事にリンクしている可能性があり、カナダのWebブラウザがロワール渓谷での休暇に関心を持っていることを知っている広告が表示されるかもしれません。パーソナライズはこれをさらに悪化させます。私のパーソナライズされた設定は、重厚な赤ワインに関するパーソナライズされた特集リストを生成する必要があります。このようなロジックはそれ自体が複雑であり、各リクエストで多くの計算が必要になり、そして最も重要なこととして、ほとんどのキャッシュ戦略を台無しにします。
これに対処する方法は、ページをセグメントに分割することです。各セグメントには、鮮度の決定方法が類似しています。ロワール旅行に関する記事は、エラーを修正するためだけに比較的静的に変更される可能性があります。「フランス」と「ロワール」のタグから供給される関連する記事リストは、より頻繁に変更されますが、おそらく数日に一度だけです。これを適切に配置すれば、これらの2つのアイテムを含むページのリクエストは、すべてをキャッシュから収集できる可能性があります。
私が目にした中で最も一般的な方法は、Webサーバーでキャッシュを形成し、ページがヒットしたときにページセグメントを組み立てることです。Sitemeshのようなツールは、このアプローチに適しています。18世紀のロワールの喜びに関するページを作成するときは、関連する記事のようなセクションへの呼び出しを含めます。実際のWebリクエストを受信すると、Webサーバーはページを取得し、別々の部分からページを組み立てます。この多くはWebサーバーにキャッシュできるため、バックエンドのドメインロジックやデータベースにアクセスする必要がありません。
さらに進んで、Web自体に存在する多くのキャッシュを使用することは興味深い可能性です。私のページは途中で何度もキャッシュされるため、このWebページへのほとんどの呼び出しは、私のWebサーバーに到達することさえありません。Webページを動的に構築し、サーバーで組み立てる場合、ページを配信するためのヒットを取る必要があります。代わりに、クライアントでページを組み立て、各セグメントを独自のURLから描画することもできます。各セグメントは、異なるキャッシュポリシーで異なる場所にキャッシュできます。
これはどのように機能するでしょうか。静的な記事コンテンツを、http://gallifreyTimes/travel/18-century-loire-delights
のようなURLでXHTMLとして保存する可能性があります。そのファイル内には、「ロワール」と「フランス」でタグ付けされた記事を調べて、いくつかの関連する記事を挿入したいと考えています。静的なページに、単純な「a」タグを入れます。
<a class = "relatedLinks" href = "relatedLinks/france+loire">Related Links</a>
静的なページのヘッダーでは、別のライブラリファイルにあるいくつかのJavaScriptにリンクします。ロワール記事をダウンロードすると、JavaScriptが実行され、適切なクラスを持つ要素、この場合は「relatedLinks」クラスを持つ「a」要素を記事内でスキャンします。(ビヘイビアライブラリはこれを行うのに適した方法です。)要素を見つけると、要素内の情報を使用して、そのセグメントのURLを合成します。この場合、要素のhref属性にあるものを使用して、http://gallifreyTimes/relatedArticles/france+loire
のようなURLを生成します。そのURLを取得すると、コンテンツを取得し、それを使用して元の「a」要素を置き換えます。関連する記事リストはURLを介して処理されるため、そのURLへの他の取得はインターネットを介してキャッシュをウォームアップさせるため、ページの取得が元のサーバーへのヒットを引き起こさない可能性が高くなります。
プレースホルダー要素をより多くのコンテンツで置き換えるためのJavaScriptの使用は、プログレッシブエンハンスメントの一形態です。私が発見したプログレッシブエンハンスメントの説明は、制限されたブラウザでアクセシビリティの機能を追加することに焦点を当てています。この例もそのメリットがあります。JavaScriptがないブラウザでページを閲覧すると、便利なリンクが表示されます。プログレッシブエンハンスメントの背後にある一般的な考え方は、提供される基本的なページが基本的なブラウザで役立つということと、JavaScriptなどの手法を使用して、より派手な機能を追加することです。
キャッシュのコンテキストでは、値は、各プログレッシブエンハンスメントが異なる鮮度ルールを持つHTMLの塊を織り込んでいることです。元のページは静的であり、関連するリンクは毎日変更されますが、両方を独立してキャッシュし、組み合わせて使用できます。鮮度ルールでページをセグメント化するように注意すれば、あらゆる種類の追加要素を含めることができます。そのため、JavaScriptでHTTPセッションからユーザーIDを取得し、それを使用してhttp://gallifreyTimes/personalWeather/martinfowler
のようなURLを構築し、コンテンツ(多くの場合、ハードドライブにキャッシュされる)を取得してページに組み込むことで、ユーザーのプロファイルに基づいたパーソナライズされた天気予報をすべてのページに含めることができます。