web-dev-qa-db-ja.com

ETagを正しく取得する

私は本を​​読んでいて、ETagの章について特に質問があります。著者は、ETagはパフォーマンスに悪影響を与える可能性があり、それらを細かく調整するか、完全に無効にする必要があると述べています。

私はすでにETagが何であるかを知っており、リスクを理解していますが、ETagを正しく取得するのは難しいですか?

これで、値が応答本文のMD5ハッシュであるETagを送信するアプリケーションを作成しました。これはシンプルなソリューションであり、多くの言語で簡単に実現できます。

  • 応答本文のMD5ハッシュをETagとして使用していますか?もしそうなら、なぜですか?

  • 著者(明らかに私に何桁も優れている)がそのような単純な解決策を提案しないのはなぜですか?

この最後の質問は、作成者でない限り回答するのが難しい:)なので、MD5ハッシュをETagとして使用することの弱点を見つけようとしています。

46
Pablo Fernandez

ETagはLast-Modifiedヘッダーに似ています。これは、クライアントによる変更を判別するメカニズムです。

間違いなく、最終変更日(つまり同じテキスト)であることが必要なETagは、ETagに必要なすべての基準を満たしています。リソースの状態を表す一意の値である必要があります。リソースのドメイン全体で一意ではなく、単にリソース内でのみ。

現在、技術的には、ETagはLast-Modifiedヘッダーと比較して「無限」の解像度を持っています。 Last-Modifiedは1秒の粒度でのみ変化しますが、ETagは1秒未満である場合があります。

ETagとLast-Modifiedの両方を実装することも、どちらか一方のみを実装することもできます(もちろん、どれも実装しません)。 Last-Modifiedでは不十分な場合は、ETagを検討してください。

ちなみに、「すべての」リソースにはETagを設定しません。基本的に、キャッシュされることを想定していないもの(特に動的コンテンツ)には設定しません。その場合、無駄な作業だけでは意味がありません。

編集:私はあなたの編集を見て、明確にします。

MD5で結構です。唯一の欠点は、常にMD5を計算することです。たとえば、200KでMD5を実行するPDFファイルはコストがかかります。キャッシュされることを想定していないリソースでMD5を実行することは無駄です(つまり、動的コンテンツ)。

トリックは、使用するメカニズムが何であれ、Last-Modifiedが通常そうであるほど安価であることです。また、Last-Modifiedは通常、リソースのプロパティであり、通常はアクセスが非常に安価です。

ETagも同様に安価である必要があります。 MD5を使用していて、リソースとMD5ハッシュの間の関連付けをキャッシュ/保存できる場合は、これが適切なソリューションです。ただし、ETagが必要になるたびにMD5を再計算することは、基本的にETagを使用してサーバー全体のパフォーマンスを向上させるという考えに反します。

47
Will Hartung

インステラの動的コンテンツにはetagsを使用しています。

私たちの戦略は、送信するコンテンツのmd5ハッシュを生成する出力の最後にあり、if-none-matchヘッダーが存在する場合は、ヘッダーを生成されたハッシュと比較します。 2つの値が同じ場合、304コードを送信し、コンテンツを返さずにリクエストを中断します。

コンテンツをハッシュするために少しCPUを消費するのは事実ですが、最後に多くの帯域幅を節約しています。

Facebookニュースフィードスタイルのメインページがあり、ユーザーごとにコンテンツが異なります。ニュースフィードのコンテンツは1時間に3〜4回しか変更されないため、メインページの更新はクライアント側にとって非常に効率的です。モバイルの時代では、帯域幅を使うよりもCPU時間をもう少し使うほうが良いと思います。帯域幅は依然としてCPUよりも高価であり、クライアントにとっては優れたエクスペリエンスです。

7

本を読んでいないので、著者の正確な懸念について話すことはできません。

ただし、ETagの生成は、ページが変更されたときにETagが一度だけ生成されるようにする必要があります。 WebページのMD5ハッシュを生成するには、サーバーの処理能力と時間がかかります。多くのクライアントが接続している場合、パフォーマンスの問題が発生する可能性があります。

したがって、必要な場合にETag onlyを生成し、関連ページが変更されるまでサーバーにキャッシュするための優れた手法が必要です。

2
Dancrumb

私は思います perceived problem ETAGSを使用している場合は、おそらく、ブラウザーがページ上のすべてのリソースに対して(単純で小さな)要求/応答を発行および解析して、etag値がサーバー側で変更されたかどうかを確認する必要があります。

私は個人的に、頻繁に変更される画像、CSS、JavaScript(サーバーがブラウザーのetagが最新である場合、サーバーがコンテンツを再送信する必要がない)に受け入れられる、サーバーへのこれらの余分な小さな往復は、「更新された」コンテンツをマークするのが非常に簡単であるためです。

0
ChristopheD