Obecnie korzystamy z CloudFront w wielu lokalizacjach Edge, aby wyświetlać obrazy produktów (prawie pół miliona), które są dynamicznie przeskalowywane do rozmiarów o różnych rozmiarach. Nasza dystrybucja Cloudfront używa skryptu źródłowego EC2 php do pobrania oryginalnego obrazu z S3, przekształcenia go dynamicznie w oparciu o dostarczone kryteria zapytania (szerokość, wysokość, kadrowanie, itp.) I przesłania go z powrotem do Cloudfront, który przechowuje je w lokalizacji krawędzi.Wstępne buforowanie dynamicznie generowanych obrazów dla wielu lokalizacji krawędzi na Amazon Cloudfront
Jednak użytkownik odwiedzający stronę po raz pierwszy ładujący obraz bez pamięci podręcznej zostaje trafiony przez tę dość ciężką transformację.
Chcielibyśmy mieć możliwość "wstępnego buforowania" naszych obrazów (za pomocą zadania wsadowego wymagającego każdego adresu URL obrazu), aby użytkownicy końcowi nie byli pierwszymi, którzy uderzyliby obraz w określonym rozmiarze itp.
Niestety, ponieważ obrazy są przechowywane tylko w pamięci podręcznej w lokalizacji krawędzi przypisanej do usługi buforowania wstępnego, użytkownicy odwiedzający stronę używający innej lokalizacji krawędzi nie otrzymają obrazu z pamięci podręcznej i zostaną trafieni ciężkim skryptem zmiany rozmiaru na serwerze źródłowym.
Jedynym rozwiązaniem zaszliśmy od z, gdzie każdy może pobrać Położenie krawędzi obrazu w rozsądnym czasie ładowania, jest to:
Mamy dystrybucję CloudFront wskazujący na skrypcie php pochodzenie EC2. Ale zamiast wykonywać transformację obrazu opisaną powyżej, skrypt początkowy przekazuje żądanie i parametry zapytania do innej dystrybucji Cloudfront. Ta dystrybucja ma pochodny skrypt PHP EC2, który wykonuje transformację obrazu. W ten sposób obraz jest zawsze zapisywany w pamięci podręcznej w lokalizacji Edge w pobliżu naszej instancji EC2 (Irlandia), co pozwala uniknąć przeprowadzenia kolejnej transformacji, gdy obraz jest wymagany z innej lokalizacji krawędzi.
Na przykład, żądanie w Szwecji trafienia/image/stream/id/12345, które szwedzka lokalizacja nie ma w pamięci podręcznej, więc wysyła zapytanie do kraju pochodzenia, którym jest maszyna EC2 w Irlandii . Strona "streaming" EC2 ładuje/image/size/id/12345 z innej dystrybucji Cloudfront, która trafia w lokalizację Irish Edge, która również nie ma jej w pamięci podręcznej. Następnie przesyła żądanie do miejsca pochodzenia, ponownie do tej samej maszyny EC2, ale do strony "rozmiaru", która zmienia rozmiar. Następnie zarówno lokalizacja Edge w Szwecji, jak i w Irlandii mają buforowany obraz.
Teraz wniosek Francji żąda tego samego obrazu. Lokalizacja francuskiej krawędzi nie ma jej w pamięci podręcznej, więc wywołuje pochodzenie, którym jest maszyna EC2 w Irlandii, która wywołuje drugą dystrybucję CF, która ponownie uderza w irlandzką lokalizację krawędzi. Tym razem obraz jest przechowywany w pamięci podręcznej i można go natychmiast zwrócić. Teraz francuska lokalizacja krawędzi ma również buforowany obraz, ale bez konieczności wywoływania strony "zmiana rozmiaru" - tylko strona "streaming" z obrazem z pamięci podręcznej w Irlandii.
Oznacza to również, że nasza „pre-buforowanie” usługa partia w Irlandii można zrobić wniosek przeciwko irlandzki krawędzi Położenie i pre-cache obrazów przed ich prośbę naszych odwiedzających.
Wiemy, że to wygląda trochę absurdalne, ale z pragnieniem, które mamy, aby użytkownik końcowy nie musiał długo czekać podczas zmiany rozmiaru obrazu, wydaje się, że jest to jedyne konkretne rozwiązanie:
Czy przeoczyliśmy inne/lepsze rozwiązanie? Wszelkie komentarze do powyższego?