Attualmente stiamo utilizzando CloudFront in molte Edge Location per servire immagini dei prodotti (quasi mezzo milione) che vengono ridimensionate dinamicamente in dimensioni di dimensioni diverse. La nostra distribuzione di Cloudfront utilizza uno script php di origine EC2 per recuperare l'immagine originale da S3, trasformarla dinamicamente in base ai criteri di querystring forniti (larghezza, altezza, ritaglio, ecc.) E riversarla su Cloudfront che la memorizza nella posizione del bordo.Pre-caching immagini generate dinamicamente per più edge location su Amazon Cloudfront
Tuttavia, il visitatore del sito Web che carica un'immagine non memorizzata nella cache la prima volta viene colpito da questa trasformazione piuttosto pesante.
Ci piacerebbe avere la possibilità di "pre-memorizzare" le nostre immagini (utilizzando un lavoro batch che richiede l'URL di ciascuna immagine) in modo che gli utenti finali non siano i primi a colpire un'immagine con una dimensione particolare, ecc.
Sfortunatamente, poiché le immagini vengono memorizzate solo nella posizione Edge assegnata al servizio di pre-cache, i visitatori del sito Web che utilizzano un'altra posizione Edge non otterranno l'immagine memorizzata nella cache e verranno colpiti con il pesante script di ridimensionamento sul server di origine.
L'unica soluzione che siamo arrivati insieme ai, dove ogni bordo Località può recuperare un'immagine entro il tempo di caricamento ragionevole, è questa:
Abbiamo una distribuzione Cloudfront che punta a uno script php origine EC2. Ma invece di eseguire la trasformazione dell'immagine sopra descritta, lo script di origine inoltra i parametri request e querystring a un'altra distribuzione Cloudfront. Questa distribuzione ha uno script php di origine EC2 che esegue la trasformazione dell'immagine. In questo modo, l'immagine viene sempre memorizzata nella posizione Edge vicino alla nostra istanza EC2 (Irlanda), evitando così di eseguire un'altra trasformazione quando l'immagine viene richiesta da un'altra posizione Edge.
Così, ad esempio, una richiesta in Svezia colpisce/image/stream/id/12345, che la posizione Edge svedese non ha memorizzato nella cache, quindi invia una richiesta all'origine, che è la macchina EC2 in Irlanda . La pagina di "streaming" EC2 carica quindi/image/size/id/12345 da un'altra distribuzione di Cloudfront, che colpisce l'Irish Edge Location, che non ha nemmeno la cache. Invia quindi una richiesta all'origine, sempre la stessa macchina EC2, ma alla pagina 'dimensione' che esegue il ridimensionamento. Dopodiché, sia Edge Location in Svezia che in Irlanda hanno l'immagine memorizzata nella cache.
Ora, una richiesta dalla Francia richiede la stessa immagine. French Edge Location non lo ha memorizzato nella cache, quindi chiama l'origine, che è la macchina EC2 in Irlanda, che chiama la seconda distribuzione CF che colpisce ancora l'irlandese Edge Location. Questa volta ha l'immagine memorizzata nella cache e può restituirla immediatamente. Ora la posizione Edge francese ha anche l'immagine memorizzata nella cache, ma senza dover chiamare la pagina 'ridimensionamento' - solo la pagina 'streaming' con l'immagine della cache in Irlanda.
Questo significa anche che la nostra 'pre-caching" Servizio in batch in Irlanda può fare richiesta contro il bordo Località irlandese e pre-cache delle immagini prima che vengano richiesti dai nostri visitatori del sito web.
Sappiamo che sembra un po 'assurdo, ma con il desiderio che abbiamo, che l'utente finale non debba mai aspettare a lungo mentre l'immagine viene ridimensionata, sembra l'unica soluzione tangibile
Abbiamo trascurato un'altra/migliore soluzione? Qualsiasi commento a quanto sopra?