Lastreduzierung am Ursprung
Übersicht
Die Erhöhung der Cache-Trefferrate (CHR) mit CloudFront verbessert die Leistung einer Webanwendung und reduziert die Belastung für ihren Ursprung. CHR ist das Verhältnis der HTTP-Anfragen, die vom CloudFront-Cache bedient werden, zur Gesamtzahl der Anfragen. Anfragen, die vom CloudFront-Cache bedient werden, profitieren von einer besseren Latenz (z. B. Zeit bis zum letzten Byte), weshalb CHR ein guter Indikator für Ursprungs-Offload und Anwendungsleistung ist. Die CHR einer CloudFront-Distribution kann mithilfe der CloudWatch-Metrik namens Cache-Trefferrate überwacht werden. Um die CHR zu erhöhen, können Sie die Caching-Konfiguration in CloudFront optimieren, Origin Shield aktivieren und Ihr Anwendungsverhalten verbessern.
Höhere Time to Live für Caches (TTL)
Sie können steuern, wie lange ein Objekt in CloudFront zwischengespeichert wird, indem Sie den von Ihrem Ursprung gesendeten Cache-Control-Header verwenden, der durch die Time To Live-Einstellungen in den Cache-Richtlinien begrenzt ist. Eine Erhöhung der TTLs wirkt sich positiv auf die CHR aus. Daher wird Folgendes empfohlen:
- Konfigurieren Sie Cache-Control-Header auf dem Ursprung, um TTL in CloudFront besser steuern zu können und das Browser-Caching zu nutzen.
- Zwischenspeichern Sie statische Assets als unveränderliche Objekte (z. B. Cache-Control: max-age=31536000, immutable) und versionieren Sie ihren URL-Pfad (z. B. /static/app.1be87a.js).
- Implementieren Sie ETAGs für Ihre Objekte, um von bedingten HTTP-Anfragen an Ihren Ursprung zu profitieren.
- Finden Sie bei dynamischeren Inhalten wie HTML das richtige Gleichgewicht zwischen Zwischenspeichern (hohe TTL) und dem Grad, in dem die Anwendung veralteten Inhalt toleriert (niedrige TTL).
Cache-Schlüsseleinstellungen optimieren
Die Cache-Schlüsseleinstellungen unter Verwendung von Cache-Richtlinien bestimmen, ob CloudFront ein zwischengespeichertes Objekt für eine HTTP-Anfrage wiederverwendet oder nicht. Optimierte Cache-Schlüsseleinstellungen führen zu einer 1-zu-1-Beziehung zwischen eindeutigen Cache-Schlüsseln und eindeutigen Objekten. Stellen Sie sich eine Webanwendung vor, die unabhängig von den angehängten Abfrageparametern dieselbe /about.html bereitstellt (z. B. /about.html? utm_medium=social). Wenn der Cache-Schlüssel so konfiguriert ist, dass er den Abfrageparameter „utm_medium“ enthält, speichert CloudFront verschiedene URLs im Cache (z. B. /about.html? utm_medium=social und /about.html? utm_medium=email) mit zwei unterschiedlichen Cache-Schlüsseln. Dies führt zu zwei Cache-Fehlern beim Ursprung, obwohl sich beide Anfragen auf exakt dieselbe Datei auf dem Ursprung beziehen, was suboptimal ist.
Die erste bewährte Methode zur Optimierung der Cache-Schlüsseleinstellungen besteht darin, ausschließlich solche Anfrageattribute in den Cache-Schlüssel aufzunehmen, die Antworten des Ursprungs ändern. Dazu wird Folgendes empfohlen:
- Konfigurieren Sie separate Cache-Verhalten für Objekte, die unterschiedliche Cache-Schlüsseleinstellungen erfordern.
- Wenn Abfrageparameter, Header oder Cookies die Antworten am Ursprung ändern, schließen Sie nur diejenigen ein, die das tatsächlich tun (z. B. cookie user_id statt aller Cookies).
- Verwenden Sie Response Header-Richtlinien in CloudFront, um CORS-Header zu verwalten, anstatt CORS-Header zum Cache-Schlüssel hinzuzufügen (z. B. Origin, Access-Control-Request-Method, Access-Control-Request-Headers) oder CORS auf der Ursprungsebene zu verwenden.
- Lagern Sie die Zugriffskontrolle mithilfe signierter URLs, CloudFront-Funktionen oder Lambda@Edge an CloudFront aus, anstatt dem Cache-Schlüssel den Authorization-Header hinzuzufügen und ihn auf der Ursprungsebene zu verwalten.
- Verwenden Sie die Richtlinie für Ursprungsanfragen in CloudFront, um HTTP-Attribute an den Ursprung weiterzuleiten, anstatt sie dem Cache-Schlüssel hinzuzufügen.
Die zweite bewährte Methode besteht darin, ein Anforderungsattribut zu normalisieren, bevor es dem Cacheschlüssel hinzugefügt wird, um die Kardinalität seiner möglichen Werte zu reduzieren, sodass jeder Wert zu einem eindeutigen Cacheschlüssel führt. Dazu wird Folgendes empfohlen:
- Falls Sie Abfrageparameter verwenden, senden Sie sie in derselben Reihenfolge und mit derselben Groß- und Kleinschreibung
- Verwenden Sie von CloudFront generierte Header wie CloudFront-Is-Mobile-Viewer, um einen Gerätetyp zu identifizieren, anstatt dem Cache-Schlüssel einen Benutzer-Agent-Header hinzuzufügen.
- Verwendung von CloudFront-Funktionen zur Anwendung erweiterter Normalisierungen, z. B.: Neuanordnung von Abfrageparametern und Umwandeln zu Kleinschreibung; Bereitstellung einer anderen Version einer Webseite basierend auf der Existenz eines Cookies, anstatt das Cookie zum Cache-Schlüssel hinzuzufügen; Reduzierung der Varianz von nach Land variierenden Antworten, wenn dieselbe Antwort für eine Gruppe von Ländern gesendet werden kann; weitere Reduzierung der Kardinalität von Accept-Encoding, wenn eine Komprimierung erforderlich ist, oder der Kardinalität von CloudFront Geräteerkennungsheader, wenn mehrere verwendet werden.
Origin Shield aktivieren
Standardmäßig reduziert CloudFront die Anzahl der Cache-Fehlschläge zum Ursprung, indem es zwei übergeordnete Caching-Ebenen verwendet: eine Ebene auf PoP-Ebene und eine weitere Ebene auf Regional Edge Cache(REC)-Ebene. Ein CloudFront-PoP ist nominell einem der über 10 RECs weltweit zugeordnet. Wenn eine Anfrage zu einem Cache-Fehler auf PoP-Ebene führt, überprüft CloudFront den Cache des zugehörigen REC, um die Anfrage zu erfüllen. Nur wenn sie nicht in dieser REC zwischengespeichert ist, leitet CloudFront die Anfrage an den Ursprung weiter. RECs sind voneinander isoliert, um eine hohe Verfügbarkeit aufrechtzuerhalten, und teilen daher ihre Caches nicht. Wenn beliebte Objekte von verschiedenen Standorten auf der ganzen Welt angefordert werden, sendet CloudFront daher mehrere Anfragen für dieselben Objekte von mehreren RECs an den Ursprung.
Um die Anzahl der an den Ursprung weitergeleiteten Anfragen zu reduzieren, können Sie Origin Shield in CloudFront aktivieren, eine dritte allgemeine Cache-Ebene zwischen RECs und Ihrem Ursprung. Anstatt Objekte direkt vom Ursprung anzufordern, versuchen RECs zunächst, Anfragen aus dem Origin Shield-Cache zu erfüllen.
Anwendungsverhalten optimieren
Verschiedene Änderungen auf Anwendungsebene können sich positiv auf die Cache-Trefferquote auswirken. Einige Beispiele:
- Reduzierung der Kardinalitätsobjekte, die von Ihrer Anwendung bereitgestellt werden. Wenn Ihre Anwendung mehrere Wiedergabeversionen desselben Assets erzeugt, z. B. unterschiedliche Größen eines Bilds für unterschiedliche Bildschirmformate, sollten Sie in Betracht ziehen, die Anzahl der möglichen Werte für Breite und Höhe zu begrenzen.
- Nutzung des Browser-Caches. Dies kann mithilfe des Cache-Control-Headers erfolgen, der von Ihrem Ursprung gesendet wurde. Sie können TTLs zwischen CloudFront und dem Browser unterscheiden, indem Sie entweder max-age mit s-maxage-Anweisungen im Cache-Control-Header verwenden oder indem Sie den Cache-Control-Header für den Browser verwenden und CloudFront-TTLs mithilfe von Cache-Richtlinien steuern.
- Verwenden Sie Bytebereichsanfragen in Ihren Clients, um nur das herunterzuladen, was benötigt wird.