Ottimizzazione delle cache del sito AEM

L’ottimizzazione della memorizzazione nella cache all’interno dell’architettura AEM è uno dei modi più rapidi per ottenere un notevole miglioramento delle prestazioni. Questo articolo si concentra su come ottimizzare le varie cache disponibili all’interno di un’architettura AEM.

Descrizione description

Ambiente

Adobe Experience Manager

Problemi/Sintomi

Come ottimizzare le cache del sito AEM?

Architettura e caching di AEM

In tutte le architetture AEM, l’utente incontra più livelli di cache quando visita il sito. Ci sono 4 livelli di cache da considerare in un’architettura AEM standard. Sono incluse le istanze Browser web, CDN, Dispatcher e AEM.

screenshot_2018-03-25160541

Risoluzione resolution

A. Memorizzazione in cache del browser

Il primo livello di cache che un utente incontra durante una visita ripetuta del sito è il proprio browser. La memorizzazione in cache a livello di browser viene solitamente eseguita tramite Cache-Control: max-age=… risposta intestazione. Il età massima L'impostazione indica al browser per quanti secondi deve memorizzare in cache il file prima di tentare di "riconvalidarlo" o richiederlo nuovamente al sito. Questo concetto di cache età massima viene comunemente indicato come "Scadenza cache" o TTL ("Time to Live", durata della cache).

Ci sono varie opzioni (o "direttive") all'interno del Cache-Control che influenzano la modalità di memorizzazione in cache. Di seguito sono riportate alcune direttive comuni:

  1. private: la direttiva privata nell’intestazione Cache-Control la rende in modo che il file venga memorizzato nella cache solo nel browser, non nelle cache intermedie come le CDN. Questa direttiva potrebbe essere utile se la pagina include contenuti personalizzati o specifici per l’utente.

    Esempio: Cache-Control: max-age=300, private

  2. s-maxage: la direttiva s-maxage nell’intestazione Cache-Control ti consente di impostare un TTL diverso per le cache condivise, come le CDN. Quando questo valore è impostato, il browser utilizza quello che è impostato in max-age e altre cache rispettano invece l’impostazione s-maxage.

    Esempio: Cache-Control: max-age=600, s-maxage=300

I browser moderni supportano tutti Cache-Control Tuttavia, da HTTP/1.0 sono presenti alcune vecchie intestazioni obsolete che potrebbero ancora avere un effetto sul caching. Queste intestazioni sono Scade e Pragma. Se non devi supportare browser molto vecchi, non inviare tali intestazioni di risposta.

Oltre alla memorizzazione nella cache, anche la riconvalida è un concetto importante. La riconvalida si basa su Ultima modifica(risposta) / If-Modified-Since (richiesta) e ETag (risposta) / If-None-Match (richiesta) intestazioni.

Attenzione sul test del browser:

Durante il test del caching in Google Chrome, se esegui un test su https e disponi di un certificato autofirmato, non verrà memorizzato nulla nella cache. Chrome non memorizza nella cache le risposte né esegue la riconvalida in presenza di 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 il /enableTTL solo cache che utilizzano età massima direttiva. Ciò significa che anche quando privato o s-maxage vengono impostate delle direttive, ma la cache viene comunque eseguita se età massima è impostato. Questo problema è stato risolto in Dispatcher 4.2.4 e versioni successive.

B. Memorizzazione in cache della rete CDN

A CDN o "Content Delivery Network", è una rete distribuita di server web progettati per memorizzare in cache e distribuire i contenuti dalla posizione più vicina agli utenti. In questo modo si riducono i passaggi di rete e la distanza tra il computer dell'utente e il contenuto, riducendo in tal modo "Round Trip Time" (RTT). RTT è il tempo necessario al browser per inviare una richiesta al sito e ricevere una risposta. La concorrenza nello spazio del provider CDN ha reso le CDN molto convenienti. In questo modo la decisione di utilizzare una rete CDN per il sito diventa semplice. Se non utilizzi ancora una CDN, devi sicuramente incorporare una CDN nel sito.

Ci sono molti provider CDN, ciascuno dei quali offre diverse funzioni e configurazioni.

Come funziona il caching della rete CDN?

Le CDN memorizzano in cache il contenuto seguendo regole simili a quelle dei browser. Si basano sulla Cache-Control HTTP risposta e in genere torna all’intestazione Scade intestazione se no Cache-Control intestazione trovata.

La maggior parte delle reti CDN fornisce un modo per attivare lo scaricamento manuale della cache.  In molti casi, gli svuotamenti della cache hanno un certo ritardo (ad esempio 15 minuti) nella propagazione a tutti i server perimetrali che hanno i tuoi file.

Ottimizzazione dell’utilizzo della CDN

Esistono alcune operazioni per assicurarti di memorizzare i file nella cache in modo ottimale nella rete CDN:

  1. Utilizza una rete CDN che supporta stale-while-revalidate e stale-if-error direttive in Cache-Control intestazione.

    • stale-while-revalidate - questa direttiva indica al CDN di distribuire la vecchia versione (già memorizzata nella cache) del file mentre ne recupera una nuova dopo la scadenza del file della cache.
    • stale-if-error - analogamente, questa direttiva indica alla rete CDN di distribuire la vecchia versione (già memorizzata nella cache) del file quando l’origine risponde con un errore durante il rinnovo.
  2. Risposte di compressione GZip per tutti i tipi di file non precompressi.

    Dovresti eseguire questa operazione a livello di Dispatcher. In questo modo sarà possibile ridurre il numero di byte inviati alla rete CDN. Le reti CDN vengono solitamente caricate in base ai byte trasferiti, pertanto la compressione delle risposte riduce i costi.

    • Abilitare la compressione GZip a livello di Dispatcher: Apache - usa mod_deflate. Prestare attenzione all'uso di mod_deflate della variabile. In alcuni casi, l’intestazione Vary può causare il totale salto del caching della rete CDN e del browser.

    • Microsoft IIS - utilizzare Compressione dinamica.

    • Non consentire la compressione Gzip di file di grandi dimensioni o 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 in termini di prestazioni.

      • Su Apache, è possibile eseguire questa operazione 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 < dynamicTypes> configurazione.
    • Se il provider CDN supporta Inclusioni lato bordo (ESI) quindi sfruttare questa funzione. I componenti AEM possono essere suddivisi utilizzando ESI. Per eseguire l’operazione, utilizza Apache \[ Inclusioni dinamiche Sling\] o implementa una soluzione personalizzata. È utile quando si dispone di pagine piuttosto statiche, ma si sta distribuendo contenuto più dinamico in alcune parti della pagina. In questi casi, si sta essenzialmente suddividendo la pagina in più file CDN. In questo modo puoi memorizzare in cache diverse parti della pagina per diversi periodi di tempo.

Provider CDN popolari

Ecco un elenco di alcuni provider CDN popolari:

Ce ne sono molti altri, ciascuno con caratteristiche diverse.

Attenzione:

Presta attenzione alla Variabile intestazione di risposta. In alcuni casi, Variabile può fare in modo che la CDN e il browser saltino completamente la memorizzazione in cache. Come regola empirica generale, evita di aggiungere Variabile eccetto per Variabile: Accept-Encoding (applicato 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 del HTML per dispositivi mobili rispetto a desktop, utilizza un URL diverso. In questo modo le CDN e i browser potranno memorizzare in cache in modo più efficace.

C. Memorizzazione in cache del dispatcher AEM

Se la cache CDN è scaduta, la richiesta raggiungerà la cache del dispatcher AEM. A questo livello, ci sono molte operazioni possibili da eseguire per ottimizzare la memorizzazione in cache.

Poiché si tratta di un argomento più ampio, vedere questo articolo per informazioni dettagliate su come ottimizzare la cache del dispatcher.

D. 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 dall’AEM per impostazione predefinita.

    1. Cache-Control: max-age=… - Per impostare questa intestazione: ACS Commons - TTL Dispatcher potrebbe essere utilizzato, oppure puoi implementare un codice personalizzato per impostarlo.
    2. Ultima modifica - Se il contenuto della pagina è relativamente statico, ad esempio un articolo, puoi impostare la sua ultima intestazione modificata su cq:lastModified date/time (lastModified date/time) (ultima modifica dell’articolo). 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 al posto di Ultima modifica, è possibile scrivere un ReplicationEventListener che ascolta le attivazioni delle pagine e genera un hash md5 del contenuto della pagina. Questa potrebbe essere impostata 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 correttamente, 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 contenuti personalizzati/dinamici:

    1. Utilizzare Apache Sling Dynamic Include suddividere il contenuto in modo che parti diverse della pagina possano essere memorizzate nella cache per periodi di tempo diversi.

      1. Il caching può essere eseguito con le seguenti tecnologie:

        • Include ESI (Edge-side Includes) sulla rete CDN
        • Inclusioni lato server (SSI) sul server web
        • 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 diversi periodi di tempo. Parti della pagina che sono relativamente statiche potrebbero essere memorizzate nella cache per periodi di tempo molto più lunghi.

    2. Valuta l’utilizzo di Funzione cache HTTP di ACS Commons.

  3. Ottimizzare le librerie client.

    1. Abilita la minimizzazione nelle librerie client.

    2. Se i file nella libreria client sono preminimizzati, disabilita la minimizzazione in tale libreria client. Modifica il nodo cq

      1. Imposta proprietà jsProcessor di tipo String[ ] con valore min:none
      2. e imposta la proprietà cssProcessor di tipo String[ ] con valore min:none
      3. Vedi ulteriori dettagli, qui.
    3. Incorporare le librerie client per minimizzare e ridurre i file js e css.

    4. Implementare librerie client con versione da ACS Commons per consentire alla CDN e al Dispatcher di memorizzare in cache i file js e css per periodi di tempo più lunghi.

recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f