Grundlegendes zum Cache-Schlüssel - Amazon CloudFront

Grundlegendes zum Cache-Schlüssel

Der Cache-Schlüssel bestimmt, ob eine Viewer-Anforderung an einen CloudFront-Edge-Standort zu einem Cache-Treffer führt. Der Cache-Schlüssel ist der eindeutige Bezeichner für ein Objekt im Cache. Jedes Objekt im Cache verfügt über einen eindeutigen Cache-Schlüssel.

Ein Cache-Treffer tritt auf, wenn eine Viewer-Anforderung denselben Cache-Schlüssel wie eine vorherige Anforderung generiert und sich das Objekt für diesen Cache-Schlüssel im Cache des Edge-Standorts befindet und gültig ist. Wenn es einen Cache-Treffer gibt, wird das angeforderte Objekt an den Viewer von einem CloudFront-Edge-Standort bereitgestellt, was die folgenden Vorteile hat:

  • Geringere Auslastung Ihres Ursprungs-Servers

  • Reduzierte Latenz für den Viewer

Sie können eine bessere Leistung für Ihre Website oder Anwendung erzielen, wenn Sie eine höhere Cache-Trefferquote haben (ein höherer Anteil an Viewer-Anforderungen, die zu einem Cache-Treffer führen). Eine Möglichkeit, die Cache-Trefferquote zu verbessern, besteht darin, nur die minimal notwendigen Werte in den Cache-Schlüssel aufzunehmen. Weitere Informationen finden Sie in den folgenden Abschnitten.

Sie können die Werte (URL-Abfragezeichenfolgen, HTTP-Header und Cookies) im Cache-Schlüssel mithilfe einer Cache-Richtlinie ändern. (Sie können den Cache-Schlüssel auch mit einer Lambda@Edge-Funktion ändern.) Bevor Sie den Cache-Schlüssel ändern, ist es wichtig zu verstehen, wie Ihre Anwendung entworfen ist und wann und wie sie verschiedene Antworten basierend auf den Eigenschaften der Viewer-Anforderung bereitstellen kann. Wenn ein Wert in der Viewer-Anforderung die Antwort bestimmt, die Ihr Ursprung zurückgibt, sollten Sie diesen Wert in den Cache-Schlüssel aufnehmen. Wenn Sie jedoch einen Wert in den Cache-Schlüssel einfügen, der sich nicht auf die Antwort auswirkt, die Ihr Ursprung zurückgibt, kann es passieren, dass Sie doppelte Objekte zwischenspeichern.

Der Standard-Cache-Schlüssel

Standardmäßig enthält der Cache-Schlüssel für eine CloudFront-Verteilung die folgenden Informationen:

  • Der Domänenname der CloudFront-Verteilung (z. B. d111111abcdef8.cloudfront.net)

  • Der URL-Pfad des angeforderten Objekts (z. B, /content/stories/example-story.html)

Anmerkung

DieOPTIONS-Methode ist im Cache-Schlüssel für OPTIONS-Anforderungen enthalten. Dies bedeutet, dass Antworten auf OPTIONS-Anforderungen getrennt von Antworten auf GET- und HEAD-Anforderungen zwischengespeichert werden.

Andere Werte aus der Viewer-Anforderung sind standardmäßig nicht im Cache-Schlüssel enthalten. Betrachten Sie die folgende HTTP-Anforderung von einem Webbrowser.

GET /content/stories/example-story.html?ref=0123abc&split-pages=false HTTP/1.1 Host: d111111abcdef8.cloudfront.net User-Agent: Mozilla/5.0 Gecko/20100101 Firefox/68.0 Accept: text/html,*/* Accept-Language: en-US,en Cookie: session_id=01234abcd Referer: https://news.example.com/

Wenn eine Viewer-Anforderung wie diese an einen CloudFront-Edge-Standort gesendet wird, verwendet CloudFront den Cache-Schlüssel, um festzustellen, ob ein Cache-Treffer vorliegt. Standardmäßig sind nur die fett gedruckten Informationen im Cache-Schlüssel enthalten. Wenn sich das angeforderte Objekt nicht im Cache befindet (ein „Cache-Fehler“), sendet CloudFront eine Anforderung an den Ursprung, um das Objekt zu erhalten. CloudFront gibt das Objekt nach dem Abrufen an den Viewer zurück und speichert es im Cache des Edge-Standorts.

Wenn CloudFront eine weitere Anforderung für dasselbe Objekt empfängt, wie durch den Cache-Schlüssel bestimmt, sendet CloudFront das zwischengespeicherte Objekt sofort an den Viewer, ohne eine Anforderung an den Ursprung zu senden. Beachten Sie beispielsweise die folgende HTTP-Anforderung, die nach der vorherigen Anforderung eingeht.

GET /content/stories/example-story.html?ref=xyz987&split-pages=true HTTP/1.1 Host: d111111abcdef8.cloudfront.net User-Agent: Mozilla/5.0 AppleWebKit/537.36 Chrome/83.0.4103.116 Accept: text/html,*/* Accept-Language: en-US,en Cookie: session_id=wxyz9876 Referer: https://rss.news.example.net/

Diese Anforderung gilt für dasselbe Objekt wie die vorherige Anforderung, unterscheidet sich jedoch von der vorherigen Anforderung. Sie hat eine andere URL-Abfragezeichenfolge, verschiedene User-Agent- und Referer-Header und ein anderes session_id- Cookie. Keiner dieser Werte ist jedoch standardmäßig Teil des Cache-Schlüssels, so dass diese zweite Anforderung zu einem Cache-Treffer führt.

Anpassen des Cache-Schlüssels

In einigen Fällen möchten Sie möglicherweise mehr Informationen in den Cache-Schlüssel aufnehmen, obwohl dies zu weniger Cache-Treffern führen kann. Sie können angeben, was in dem Cache-Schlüssel enthalten sein soll, indem Sie eine Cache-Richtlinie verwenden.

Wenn Ihr Ursprungs-Server beispielsweise den Accept-Language-HTTP-Header in Viewer-Anforderungen verwendet, um unterschiedliche Inhalte basierend auf der Sprache des Viewers zurückzugeben, sollten Sie diesen Header möglicherweise in den Cache-Schlüssel einfügen. Wenn Sie dies tun, verwendet CloudFront diesen Header, um Cache-Treffer zu bestimmen, und schließt den Header in Ursprungsanforderungen ein (Anforderungen, die von CloudFront an den Ursprung gesendet werden, wenn ein Cache Fehler auftritt).

Eine potenzielle Folge der Aufnahme zusätzlicher Werte in den Cache-Schlüssel besteht darin, dass CloudFront aufgrund der Abweichungen, die in Viewer-Anforderungen auftreten können möglicherweise doppelte Objekte zwischenspeichert. Beispielsweise können Viewer einen der folgenden Werte für die Accept-Language-Header senden:

  • en-US,en

  • en,en-US

  • en-US, en

  • en-US

Alle diese unterschiedlichen Werte weisen darauf hin, dass die Sprache des Viewers Englisch ist, aber die Abweichungen können dazu führen, dass CloudFront dasselbe Objekt mehrmals im Cache zwischenspeichert. Dies kann Cache-Treffer reduzieren und die Anzahl der Ursprungsanforderungen erhöhen. Sie können diese Dopplung vermeiden, indem Sie den Accept-Language-Header nicht in den Cache-Schlüssel einfügen und stattdessen Ihre Website oder Anwendung so konfigurieren, dass verschiedene URLs für Inhalte in verschiedenen Sprachen verwendet werden (z. B. /en-US/content/stories/example-story.html).

Bei jedem gegebenen Wert, den Sie in den Cache-Schlüssel einschließen möchten, sollten Sie sicherstellen, dass Sie verstehen, wie viele verschiedene Variationen dieses Werts in Viewer-Anforderungen angezeigt werden können. Bei bestimmten Anforderungswerten ist es selten sinnvoll, sie in den Cache-Schlüssel aufzunehmen. Beispielsweise kann der User-Agent-Header Tausende von eindeutigen Variationen haben, daher ist er im Allgemeinen kein guter Kandidat für die Aufnahme in den Cache-Schlüssel. Cookies, die benutzerspezifische oder sitzungsspezifische Werte aufweisen und über Tausende (oder sogar Millionen) von Anforderungen eindeutig sind, sind auch keine guten Kandidaten für die Aufnahme in Cache-Schlüssel. Wenn Sie diese Werte in den Cache-Schlüssel aufnehmen, führt jede eindeutige Variation zu einer weiteren Kopie des Objekts im Cache. Wenn diese Kopien des Objekts nicht eindeutig sind oder wenn Sie eine so großen Anzahl von leicht unterschiedlichen Objekten haben, dass jedes Objekt nur eine kleine Anzahl von Cache-Treffern erhält, sollten Sie einen anderen Ansatz in Betracht ziehen. Sie können diese hochvariablen Werte aus dem Cache-Schlüssel ausschließen oder Objekte als nicht zwischenspeicherbar markieren.

Seien Sie vorsichtig, wenn Sie den Cache-Schlüssel anpassen. Manchmal ist dies wünschenswert, es kann aber unbeabsichtigte Konsequenzen haben, wie z. B. das Zwischenspeichern von doppelten Objekten, die Verringerung der Cache-Trefferquote und die Erhöhung der Anzahl der Ursprungsanforderungen. Wenn Ihre Ursprungs-Website oder -Anwendung bestimmte Werte von Viewer-Anforderungen für Analysen, Telemetrie oder andere Verwendungszwecke erhalten muss, diese Werte jedoch das vom Ursprung zurückgegebene Objekt nicht ändern, verwenden Sie eine Ursprungsanforderungsrichtlinie um diese Werte in Ursprungsanforderungen einzuschließen, sie aber nicht in den Cache-Schlüssel aufzunehmen.