Wir verwenden derzeit CloudFront in vielen Edge-Standorten, um Produktbilder (fast eine halbe Million) zu liefern, die dynamisch in verschiedene Größenabmessungen geändert werden. Unsere Cloudfront-Distribution verwendet ein originales EC2-PHP-Skript, um das Originalbild aus S3 abzurufen, basierend auf den angegebenen Querystring-Kriterien (Breite, Höhe, Zuschneiden usw.) dynamisch zu transformieren und es an Cloudfront zurückzuspeichern.Pre-Caching dynamisch generierter Bilder für mehrere Edge-Standorte auf Amazon Cloudfront
Allerdings, Website-Besucher laden ein nicht im Cache gespeichertes Bild das erste Mal durch diese ziemlich schwere Transformation getroffen werden.
Wir hätten gerne die Möglichkeit, unsere Bilder "vorab zu cachen" (indem wir einen Stapeljob verwenden, der jede Bild-URL anfordert), so dass die Endanwender nicht als erste ein Bild in einer bestimmten Größe treffen usw.
Da die Bilder nur an der Edge-Position zwischengespeichert werden, die dem Pre-Caching-Dienst zugewiesen ist, erhalten Websitebesucher, die einen anderen Edge-Speicherort verwenden, das zwischengespeicherte Image nicht und werden mit dem Skript zur Größenänderung auf dem Ursprungsserver angezeigt.
Die einzige Lösung, die wir mit kommen von haben, wo jede Kante Ort ein Bild innerhalb einer angemessenen Ladezeit abrufen kann, ist dies:
Wir haben eine Cloudfront-Distribution, die einen Ursprung EC2 PHP-Skript verweist. Statt die oben beschriebene Bildumwandlung durchzuführen, leitet das Origin-Skript die Parameter für die Anforderung und die Abfragezeichenfolge an eine andere Cloudfront-Verteilung weiter. Diese Distribution hat ein Ursprungs-EC2-PHP-Skript, das die Bildumwandlung durchführt. Auf diese Weise wird das Bild immer an der Edge-Position in der Nähe unserer EC2-Instanz (Irland) zwischengespeichert, wodurch vermieden wird, eine weitere Transformation durchzuführen, wenn das Bild von einer anderen Kantenposition angefordert wird.
So, zum Beispiel, eine Anfrage in Schweden/image/stream/id/12345, die die schwedische Edge Location nicht zwischengespeichert hat, so sendet es eine Anfrage an den Ursprung, der die EC2-Maschine in Irland ist . Die EC2-Seite "streaming" lädt dann/image/size/id/12345 aus einer anderen Cloudfront-Distribution, die den Irish Edge-Standort erreicht, der sie auch nicht zwischengespeichert hat. Es sendet dann eine Anfrage an den Ursprung, wiederum die gleiche EC2-Maschine, aber an die "Größe" -Seite, die die Größenänderung vornimmt. Danach wird das Bild im Edge-Standort in Schweden und in Irland zwischengespeichert.
Jetzt fordert eine Anfrage aus Frankreich das gleiche Bild an. Der französische Edge-Ort hat ihn nicht zwischengespeichert, daher nennt er den Ursprung, den EC2-Rechner in Irland, der die zweite CF-Distribution aufruft, die wiederum den irischen Edge-Standort erreicht. Dieses Mal wird das Bild zwischengespeichert und kann es sofort zurückgeben. Jetzt wird auch das Bild im Cache gespeichert, ohne dass die Seite "Größe ändern" aufgerufen wurde - nur die "Streaming" -Seite mit dem zwischengespeicherten Bild in Irland.
Das bedeutet auch, dass unser ‚Pre-Caching“ Batch-Service in Irland Anfrage gegen die irish Kantenort tun kann und Pre-Cache die Bilder, bevor sie von unseren Website-Besuchern aufgefordert sind.
Wir wissen, es sieht ein bisschen absurd, aber mit dem Wunsch, den Endnutzer sollte nie lange warten, während das Bild in der Größe geändert wird, scheint es wie die einzige greifbare Lösung
Haben wir eine andere/bessere Lösung übersehen? Irgendwelche Kommentare zu den oben genannten?