私は本を読んでいて、ETagの章について特に質問があります。著者は、ETagはパフォーマンスに悪影響を与える可能性があり、それらを細かく調整するか、完全に無効にする必要があると述べています。
私はすでにETagが何であるかを知っており、リスクを理解していますが、ETagを正しく取得するのは難しいですか?
これで、値が応答本文のMD5ハッシュであるETagを送信するアプリケーションを作成しました。これはシンプルなソリューションであり、多くの言語で簡単に実現できます。
応答本文のMD5ハッシュをETagとして使用していますか?もしそうなら、なぜですか?
著者(明らかに私に何桁も優れている)がそのような単純な解決策を提案しないのはなぜですか?
この最後の質問は、作成者でない限り回答するのが難しい:)なので、MD5ハッシュをETagとして使用することの弱点を見つけようとしています。
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を使用してサーバー全体のパフォーマンスを向上させるという考えに反します。
インステラの動的コンテンツにはetagsを使用しています。
私たちの戦略は、送信するコンテンツのmd5ハッシュを生成する出力の最後にあり、if-none-matchヘッダーが存在する場合は、ヘッダーを生成されたハッシュと比較します。 2つの値が同じ場合、304コードを送信し、コンテンツを返さずにリクエストを中断します。
コンテンツをハッシュするために少しCPUを消費するのは事実ですが、最後に多くの帯域幅を節約しています。
Facebookニュースフィードスタイルのメインページがあり、ユーザーごとにコンテンツが異なります。ニュースフィードのコンテンツは1時間に3〜4回しか変更されないため、メインページの更新はクライアント側にとって非常に効率的です。モバイルの時代では、帯域幅を使うよりもCPU時間をもう少し使うほうが良いと思います。帯域幅は依然としてCPUよりも高価であり、クライアントにとっては優れたエクスペリエンスです。
本を読んでいないので、著者の正確な懸念について話すことはできません。
ただし、ETagの生成は、ページが変更されたときにETagが一度だけ生成されるようにする必要があります。 WebページのMD5ハッシュを生成するには、サーバーの処理能力と時間がかかります。多くのクライアントが接続している場合、パフォーマンスの問題が発生する可能性があります。
したがって、必要な場合にETag onlyを生成し、関連ページが変更されるまでサーバーにキャッシュするための優れた手法が必要です。
私は思います perceived problem
ETAGSを使用している場合は、おそらく、ブラウザーがページ上のすべてのリソースに対して(単純で小さな)要求/応答を発行および解析して、etag値がサーバー側で変更されたかどうかを確認する必要があります。
私は個人的に、頻繁に変更される画像、CSS、JavaScript(サーバーがブラウザーのetagが最新である場合、サーバーがコンテンツを再送信する必要がない)に受け入れられる、サーバーへのこれらの余分な小さな往復は、「更新された」コンテンツをマークするのが非常に簡単であるためです。