2012-09-27 1 views
7

現在、さまざまなサイズのディメンションに動的にサイズ変更された製品イメージ(数百万に近い)を提供するCloudFrontを多くのエッジロケーションで使用しています。 Cloudfrontディストリビューションは、オリジナルEC2 PHPスクリプトを使用してS3から元のイメージを取得し、クエリーストリングの基準(幅、高さ、トリミングなど)に基づいて動的に変換し、エッジ位置にキャッシュするCloudfrontにストリームを戻します。Amazon Cloudfrontの複数のエッジロケーションの動的に生成されたイメージをプレキャッシュする

しかし、キャッシュされていない画像を初めてロードするウェブサイト訪問者は、この非常に重い変換によって打たれます。

エンドユーザーが特定のサイズなどで最初にイメージをヒットしないように(各イメージURLを要求するバッチジョブを使用して)イメージを「プリキャッシュ」する機能があります。

残念ながら、プレキャッシングサービスに割り当てられたエッジロケーションにのみイメージがキャッシュされるため、別のエッジロケーションを使用するWebサイト訪問者はキャッシュされたイメージを取得せず、オリジンサーバー上のサイズの大きいスクリプトでヒットします。すべてのエッジ位置が合理的なロード時間以内に画像を取得することができ、我々は持つの来

唯一の解決策は、これです:

我々は原点EC2のPHPスクリプトを指すCloudFrontの分布を持っています。しかし、上記の画像変換を行う代わりに、原点スクリプトはリクエストとクエリーコードのパラメータを別のCloudfrontディストリビューションに転送します。この分布は画像変換を実行する起点EC2 phpスクリプトを持っています。このようにして、画像はEC2インスタンス(アイルランド)の近くのエッジ位置に常にキャッシュされ、画像が別のエッジ位置から要求されたときにさらに別の変換を実行することが回避される。

たとえば、スウェーデンのエッジロケーションがキャッシュしていない/ images/stream/id/12345をヒットしたため、アイルランドのEC2マシンである原点にリクエストが送信されます。 EC2の 'ストリーミング'ページでは、他のCloudfrontディストリビューションから/ image/size/id/12345が読み込まれます。これはキャッシュされていないIrish Edge Locationにも当てはまります。その後、元のEC2マシンと同じサイズのページにリサイズを行います。この後、スウェーデンとアイルランドの両方のエッジロケーションに画像がキャッシュされます。

フランスからの依頼で同じ画像が要求されるようになりました。フレンチエッジロケーションにはキャッシュされていないため、アイルランドのEC2マシンである起源を呼び出します。このマシンは、もう一度irishエッジロケーションに当たる2番目のCFディストリビューションを呼び出します。今回は、画像がキャッシュされ、すぐに返すことができます。フランスのエッジロケーションでは、画像がキャッシュされていますが、「サイズ変更」ページを呼び出す必要はなく、アイルランドでキャッシュされた画像を含む「ストリーミング」ページのみが表示されます。私たちは、それが見えます知っ

これはまた、彼らは私たちのウェブサイトの訪問者によって要求されている前に、当社の「事前キャッシング」バッチサービスアイルランドではアイルランドのエッジ位置とプリキャッシュ画像に対する要求を行うことができますことを意味します。

画像がサイズ変更されている間にエンドユーザーが長い時間待たなければならないという欲望を持っています。

私たちは別の解決策を見落としましたか?上記のコメントはありますか?

答えて

1

これは読み込み時間を減らすことができません(y私たちの目標)。

はい、この設定では「変換時間」が節約されますが、一方でこれによってサーバー間で通信が追加されます。

I.E.クライアントコールフランス語POP >>フランス語POPコールアイルランドPOP =「変換時間」よりも長くなる可能性のあるダウンロード時間の2倍(一部)...

私はIncapsulaに勤務しています。ダイナミックコンテンツキャッシングを処理するヒューリスティックプロセスを分析するビヘイビア固有の動作。 (ここでは簡単に文書化:http://www.incapsula.com/the-incapsula-blog/item/414-advanced-caching-dynamic-through-learning

私たちの施設は次のとおりです。

1つのウェブサイトは、動的オブジェクトの数百万人を有することができるが、一部だけそれらのが繰り返し要求の対象となっています。

このロジックに従うと、訪問パターンを学習し、キャッシュのための良い候補を見つけて冗長サーバーにキャッシュするアルゴリズムがあります。 (したがって、上記の「ダブルダウンロード」を避ける)

コンテンツは、新鮮さを保つために5分ごとに再スキャンされ、ヒューリスティックシステムは追跡してコンテンツがまだ人気があることを確認します。

これは簡単すぎる説明ですが、次のような重要なアイデアを示しています。ユーザーが最も必要としているものを見つけてください。すべてのPOPを入手してください。鮮度を保ち、傾向を検出するために追跡してください。

これが役に立ちます。

0

ちょっと考えて...

2つのキャッシュを実行します。サーバー上の

  1. 各エッジの位置上の1つ、
  2. 1つ(または複数のサーバelasticache場合)アイルランドです。彼らは数分以上キャッシュする必要はありません。

要求がオリジンサーバ、リターンおよびサーバ・キャッシュ画像に出たとき、データパイプラインまたはキュー、

に添付稼働マイクロインスタンスを持っています。また、URLをキューにドロップします。

次に、デーモンに各エッジ位置を複数コールさせます。この時点で、サーバーはもう一度ヒットします(他のエッジ位置にはイメージがないため)が、高価なトランスフォームを実行する必要はなく、すぐにキャッシュから処理されます。

変換を実行しておらず、キャッシュからしか出ない場合は、大したことではありません。

ので、流れはあなたがそうでなければ、無限ループに終わるだろう、それが務め、既にキャッシュされていますことを述べるために、マーカーのいくつかのフォームを必要とするだろう。この

Request -> Cloud Front -> EC2 -> Add to cache -> Response -> CloudFront Cache -> User 
    -      -> Queue new request at each edge location 
Request -> Cloud Front -> EC2 -> already cached -> Response -> CloudFront -> User 

ようなものです。

関連する問題