Ottimizzazione AEM cache del sito

Descrizione

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.  Questo include il browser Web, CDN, Dispatcher e AEM istanze.
screenshot_2018-03-25160541

Risoluzione



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:

  1. 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:

    Cache-Control: max-age=300, private
    
  2. 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:

    Cache-Control: 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 si verifica la memorizzazione in 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 su Dispatcher:

C'è un problema con AEM Dispatcher v4.2.3 e versioni precedenti in cui /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 è risolto in Dispatcher 4.2.4 e versioni successive.





 

Memorizzazione in cache CDN



 

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:

  1. Utilizza una rete CDN che supporta stale-while-revalidate stale-if-error le direttive Controllo cache intestazione.

    • stale-while-revalidate - questa direttiva comunica alla rete CDN di servire la vecchia versione del file (già memorizzata nella cache) mentre ne recupera una nuova dopo la scadenza del file di cache.
    • stale-if-error - analogamente, questa direttiva dice alla CDN di servire la vecchia versione del file (già memorizzata nella cache) quando l'origine risponde con un errore durante la riconvalida.
  2. Comprimi le risposte per tutti i tipi di file non pre-compressi.

    • Dovresti farlo dal dispatcher livello.  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 sul Dispatcher livello:
      • Apache - uso 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.
        • On Apache, può essere eseguito tramite la direttiva AddOutputFilterByType :

          AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript

  3. 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 o implementare 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.





 

AEM Dispatcher Memorizzazione in cache



 

Se la cache CDN è scaduta, la richiesta raggiunge il AEM dispatcher cache.  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 dettagliate su come ottimizzare il dispatcher cache.



Istanze di pubblicazione AEM



 

A livello di AEM, ci sono alcune operazioni da eseguire per ottimizzare i vari livelli di cache:

  1. Imposta le seguenti intestazioni di risposta HTTP che non sono impostate da AEM per impostazione predefinita.

    1. Controllo cache: max-age=… - Per impostare questa intestazione, ACS Commons - Dispatcher TTL potrebbe essere utilizzato, oppure puoi implementare codice personalizzato per impostarlo.
    2. Ultima modifica - Se il contenuto della pagina è relativamente statico, ad esempio un articolo, è possibile impostare la sua ultima intestazione modificata sulla data/ora cq:lastModified (l'ultima volta che l'articolo è stato modificato).  Tuttavia, se la pagina è dinamica con i risultati della query JCR contenuti nel contenuto del componente, sarebbe meglio impostarla per utilizzare la data/ora corrente.
    3. ETag - se si decide di utilizzare questo anziché Ultima modifica, puoi scrivere un ReplicationEventListener che ascolta le attivazioni di pagina e genera un hash md5 del contenuto della pagina.  Questo potrebbe essere impostato come proprietà sul nodo jcr:content della pagina nell'istanza di authoring.  Quando le pagine vengono replicate, vengono inviate alle istanze di pubblicazione.  Per i componenti di pagina con contenuto relativamente statico, questo potrebbe funzionare bene, tuttavia se la pagina è in qualche modo dinamica o fa riferimento a molto contenuto, ETag dovrebbe essere omesso (o calcolato).
  2. Se il sito dispone di contenuto personalizzato/dinamico:

    1. 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.
      1. La memorizzazione in cache può essere eseguita con le seguenti tecnologie:
        1. Edge-side Includes (ESI) sulla CDN
        2. Server-side Includes (SSI) sul server web
        3. Oppure, Javascript asincrono e XML (AJAX) sul browser
      2. 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.
    2. Considera l'utilizzo di Funzione HTTP Cache di ACS Commons.
  3. Ottimizzare le librerie client.

    1. Abilita minimizzazione nelle librerie client.
    2. Se i file nella libreria client sono pre-minimizzati, disattiva la minimizzazione in quella libreria client.  Modifica il nodo cq:ClientLibraryFolder:
      1. Imposta proprietà jsProcessor di tipo String con valore min:none
      2. e imposta proprietà cssProcessor di tipo String con valore min:none
      3. Vedi ulteriori dettagli, qui.
    3. Client di incorporamento librerie per minimizzare e ridurre i file js e css.
    4. Implementare clientlibs con versione da ACS Commons consentire la rete CDN e Dispatcher per memorizzare in cache i file js e css per periodi di tempo più lunghi.

In questa pagina