5

JSON を Amazon Cloudfront にキャッシュすることを検討しています。

その問題は、JSON が更新されたときにそのキャッシュを手動でクリアするのに 15 分かかる場合があることです。

単純な JSON 値を CDN のような http キャッシュに保存する方法はありますか?

  • 初期生成後にアプリケーション サーバー (heroku) に触れない
  • キャッシュを即座に失効させることができます

アップデート

AdamKG の指摘に応えて:

「更新」されている場合、静的ではありません:D 新しいバージョンを作成し、サーバーに新しい URL を使用するように指示します。

私の実際のアイデアは、html ページが変更されるたびに新しい CloudFront URL をキャッシュすることです。それが私の最初の焦点でした。

JSON にしたい理由は、その最新の CloudFront URL のバージョン番号を保存するためです。そうすれば、ロードするバージョンを見つけるために AJAX 呼び出しを行い、次にコンテンツを実際にロードするために 2 回目の AJAX 呼び出しを行うことができます。このようにして、CloudFront コンテンツを期限切れにする必要はありません。読み込み中の ajax をリダイレクトするだけです。

しかし、JSON をキャッシュする必要があるという問題があります。単一の JSON バージョン番号を見たいと思うたびに、Heroku ダイナモにアクセスする必要はありません。memcache とラックがそれをスピードアップするのに役立つことは知っていますが、それは私が望んでいない問題です。

私が持っていたいくつかのアイデア:

  • おそらく、Memcache db に似た、JSON URL で値を公開できるサードパーティのサービスがありますか? そうすれば、私のダイナモは決して触れられません。
  • 手動でより迅速に有効期限を切れるようにする Cloudfront の代替手段があるのではないでしょうか? 私はキャッシングの性質をちょっと打ち負かしていることを知っていますが、ワニスレイヤーなどの仲介サービスがもっとあるかもしれません。
4

1 に答える 1

4

1 つの方法は、Rails の静的アセットの有効期限が切れるのと同じように、アセットの有効期限を使用することです。Rails はファイル名にハッシュ署名を追加するためapplication.jsapplication-abcdef1234567890.js. 次に、ユーザーがページをリクエストするたびに、application.js が更新されていれば、script タグに新しいアドレスが含まれます。

これが私があなたがこれを行うことを想像する方法です:

User → CloudFront (CDN) → Your App (Origin)

ユーザーのリクエストhttp://www.example.com/。このページにはメタ タグがあります

<meta content="1231231230" name="data-timestamp" />

JSON リソースを最後に更新したときに基づいています。これは<%= Widget.order(updated_at: :desc).pluck(:updated_at).first.to_i %>、Rails を使用している場合などから生成できます。

次に、アプリケーションの JavaScript でタイムスタンプを取得し、それを JSON URL に使用します。

var timestamp = $('meta[name=data-timestamp]').attr('content');
$.get('http://cdn.example.com/data-' + timestamp + '.json', function(data, textStatus, jqXHR) {
  blah(data);
});

CloudFront への最初のリクエストは、オリジン サーバーにヒットします。このリクエストは/data/data-1231231230.json生成され、永久にキャッシュされます。JSON を更新する必要があるたびに、ユーザーは CDN をクエリするための新しい URL を取得します。

アップデート

実際のページは大量にキャッシュしたいものであると述べているため、いくつかのオプションが残されています。サーバーの前に CloudFront が本当に必要な場合、唯一の現実的なオプションは、ホームページが更新されるたびに無効化リクエストを送信することです。毎月 1,000 回までは無料で無効化でき、それ以降は 1,000 回ごとに 5 ドルです。さらに、CloudFront の無効化は高速ではなく、ページが更新されるまでにまだ遅延があります。

もう 1 つのオプションは、コンテンツを Memcached にキャッシュし、dyno から提供することです。質問の履歴に基づいて、Ruby on Rails または別の Ruby フレームワークを使用していると仮定します (そうでない場合は明確にしてください)。これにはRack::Cacheのインストールが必要です。Heroku での手順はアセットのキャッシュに関するものですが、これは動的コンテンツでも機能します。invalidate次に、ページが更新されるたびにRack::Cache のメソッドを使用します。はい、dyno は負荷の一部を処理しますが、単純な Memcached ルックアップと応答になります。

サーバーのレイアウトは次のようになります。

ユーザー → CloudFront (CDN) → Rack::Cache → cdn.example.com のアプリ (オリジン) ユーザー → Rack::Cache → www.example.com のアプリ (オリジン)

画像、CSS、JavaScript などの静的アセットを提供する場合は、cdn.example.com ドメインを使用してください。これにより、CloudFront を介してリクエストがルーティングされ、長期間にわたってキャッシュされます。アプリへのリクエストは Heroku dyno に直接送信され、キャッシュ可能な部分は Rack::Cache によって保存および取得されます。

于 2013-09-01T00:14:22.620 に答える