Ambiente
Problemi/Sintomi
L'ottimizzazione della memorizzazione in cache all'interno dell'architettura AEM è uno dei modi più rapidi per ottenere un grande incremento delle prestazioni. Questo articolo si concentra su come ottimizzare le varie cache disponibili all'interno di un'architettura AEM.
Architettura AEM e memorizzazione in cache
In tutte le architetture AEM, l’utente incontra più livelli di cache quando visita il tuo sito. Ci sono 4 livelli di cache da considerare in un’architettura AEM standard. Sono incluse le istanze Browser Web, CDN, Dispatcher e AEM.
Memorizzazione in cache del browser
Il primo livello di cache che un utente incontra in una visita ripetuta del tuo sito è il proprio browser. La memorizzazione in cache a livello di browser viene comunemente effettuata tramite il Controllo cache: max-age=… response header. La età massima questa impostazione indica al browser per quanti secondi deve memorizzare in cache il file prima di tentare di "riconvalidare" o richiederlo nuovamente dal sito. Questo concetto di cache età massima viene comunemente definita "Scadenza cache" o TTL ("Time to Live").
Ci sono varie opzioni (o "direttive") all'interno Controllo cache intestazione che influisce sul modo in cui si verifica la memorizzazione in cache. Ecco alcune direttive comuni:
privato - il privato della direttiva Controllo cache l’intestazione lo rende in modo che il file venga memorizzato nella cache solo nel browser, non nelle cache intermedie come le CDN. Un utilizzo pratico di questa direttiva sarebbe se la tua pagina includesse contenuti personalizzati/specifici per l’utente.
Esempio di utilizzo:
Controllo cache: max-age=300, privato
s-maxage - il s-maxage della direttiva Controllo cache header consente di impostare un TTL diverso per le cache condivise, come le CDN. Quando questo valore viene impostato, il browser utilizza ciò che è impostato in età massima e altre cache rispettano il s-maxage invece.
Esempio di utilizzo:
Controllo cache: max-age=600, s-maxage=300
I browser moderni supportano tutti i Controllo cache header, tuttavia, esistono alcune vecchie intestazioni obsolete da HTTP/1.0 che possono ancora avere un effetto sulla memorizzazione in cache. Queste intestazioni sono Scadenza e Praga. Se non hai bisogno di supportare browser molto vecchi, non inviare quelle intestazioni di risposta.
Oltre al caching, anche la riconvalida è un concetto importante. La revoca si basa sul Ultima modifica (response) / If-Modified-Since (richiesta) e ETag (risposta) / If-None-Match (richiesta) intestazioni.
Attenzione:
Test del browser:
Quando esegui il test della cache in Google Chrome, se esegui il test su https e disponi di un certificato autofirmato, non verrà memorizzato nella cache nulla. Chrome non memorizza in cache le risposte o esegue la riconvalida quando è presente un certificato non attendibile o non valido.
Nota sul dispatcher:
Si è verificato un problema con AEM Dispatcher v4.2.3 e versioni precedenti in cui la variabile /enableTTL solo cache utilizzando età massima direttiva. Questo significa che anche quando privato o s-maxage le direttive impostate continueranno a memorizzare in cache se età massima è impostato. Questo problema è stato risolto in Dispatcher 4.2.4 e versioni successive.
Memorizzazione in cache CDN
A CDN o "Content Delivery Network", è una rete distribuita di server web progettati per memorizzare in cache e distribuire contenuti dalla posizione più vicina ai tuoi utenti. Questo riduce i salti di rete e la distanza dal computer dell'utente ai contenuti, riducendo in tal modo la "Round Trip Time" (RTT). RTT è il tempo necessario al browser per inviare una richiesta al tuo sito e ricevere una risposta. La concorrenza nello spazio del provider CDN ha reso le CDN molto convenienti. Questo rende facile la decisione di utilizzare una rete CDN per il tuo sito. Se non utilizzi ancora una CDN, dovresti sicuramente incorporare una CDN nel tuo sito.
Ci sono molti provider di CDN, ognuno dei quali offre diverse funzionalità e configurazioni.
FUNZIONAMENTO DELLA CACHE CDN
Il contenuto della cache CDN segue regole simili ai browser. Si affidano al Controllo cache HTTP response e generalmente torna all’intestazione Scadenza intestazione se no Controllo cache intestazione trovata.
La maggior parte delle CDN fornisce un modo per attivare lo scaricamento manuale della cache. In molti casi, i flush della cache hanno un certo ritardo (ad es. 15 minuti) per quanto riguarda la propagazione a tutti i server edge che hanno i tuoi file.
Ottimizzazione dell’utilizzo della CDN
Ci sono alcune cose da fare per assicurarti di memorizzare in cache i file in modo ottimale nella CDN:
Utilizza una rete CDN che supporta stale-while-revalidate e stale-if-error le direttive Controllo cache intestazione.
Comprimi le risposte per tutti i tipi di file non pre-compressi.
Devi farlo a livello di dispatcher. In questo modo si ridurrà il numero di byte inviati alla rete CDN. Le CDN vengono solitamente addebitate in byte trasferiti, pertanto la compressione delle risposte riduce i costi.
Abilita la compressione GZip a livello di Dispatcher: Apache - utilizza mod_deflate. Presta attenzione all'utilizzo della variabile da parte di mod_deflate. In alcuni casi, l’intestazione Vary può fare saltare completamente la memorizzazione in cache della rete CDN e del browser.
Microsoft IIS - utilizzare Compressione dinamica.
Non consentire la compressione gzip di file di grandi dimensioni o di file già compressi. La maggior parte dei formati immagine e video è già precompressa. Comprimerli al volo a livello di server web comporta un costo molto elevato per le prestazioni.
Su Apache, questo può essere fatto tramite la direttiva AddOutputFilterByType :
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
In IIS, questo può essere controllato tramite il configurazione dynamicTypes.
Se il provider CDN supporta Inclusioni lato bordo (ESI) quindi sfrutta questa funzione. I componenti AEM possono essere suddivisi utilizzando ESI. A questo scopo, utilizza Apache Sling Dynamic Includes(https://github.com/Cognifide/Sling-Dynamic-Include) o implementa una soluzione personalizzata. È utile quando si dispone di pagine abbastanza statiche ma si servono contenuti più dinamici in alcune parti della pagina. In questi casi si sta essenzialmente suddividendo la pagina in più file CDN. In questo modo è possibile memorizzare nella cache diverse parti della pagina per diversi periodi di tempo.
Provider CDN popolari
Ecco una lista di alcuni popolari provider di CDN:
Attenzione:
Presta attenzione alle Varia intestazione di risposta. In alcuni casi, Varia può causare sia la CDN che il browser a saltare completamente la memorizzazione in cache. Come regola generale, evita di aggiungere Varia tranne Varia: Accept-Encoding (applicata solo quando la risposta è compressa con Gzip). In altre parole, se devi "variare" l’output di una risposta, utilizza un URL diverso.
Ad esempio, se disponi di una versione diversa di HTML per dispositivi mobili rispetto al desktop, utilizza un URL diverso. Questo consentirà a CDN e browser di memorizzare in cache in modo più efficace.
Memorizzazione in cache AEM Dispatcher
Se la cache CDN è scaduta, la richiesta raggiunge la cache del dispatcher AEM. A questo livello, è possibile eseguire molte operazioni per ottimizzare la memorizzazione in cache.
Poiché si tratta di un argomento più ampio, consulta articolo per informazioni su come ottimizzare la cache del dispatcher.
Istanze di pubblicazione AEM
A livello di AEM, ci sono alcune operazioni da eseguire per ottimizzare i vari livelli di cache:
Imposta le seguenti intestazioni di risposta HTTP che non sono impostate da AEM per impostazione predefinita.
Se il sito dispone di contenuto personalizzato/dinamico:
Utilizzo Apache Sling Dynamic Includes per suddividere il contenuto in modo che diverse parti della pagina possano essere memorizzate nella cache per diversi periodi di tempo.
La memorizzazione in cache può essere eseguita con le seguenti tecnologie:
I componenti della pagina possono essere suddivisi in richieste separate che possono essere memorizzate nella cache per periodi di tempo diversi. Le parti della pagina relativamente statiche possono essere memorizzate nella cache per periodi di tempo molto più lunghi.
Considera l'utilizzo di Funzione HTTP Cache di ACS Commons.
Ottimizzare le librerie client.
Abilita minimizzazione nelle librerie client.
Se i file nella libreria client sono pre-minimizzati, disattiva la minimizzazione in quella libreria client. Modifica il nodo cq:ClientLibraryFolder:
Client di incorporamento librerie per minimizzare e ridurre i file js e css.
Implementare clientlibs con versione da ACS Commons per consentire a CDN e Dispatcher di memorizzare nella cache i file js e css per periodi di tempo più lunghi.