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 dell'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.

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 nella cache a livello di browser viene in genere eseguita tramite Cache-Control: max-age=… risposta header. L'impostazione max-age indica al browser per quanti secondi deve memorizzare il file nella cache prima di tentare di "riconvalidarlo" o di richiederlo nuovamente al sito. Questo concetto di cache max-age viene comunemente definito "Scadenza cache" o TTL ("Time to Live").

Nell'intestazione Cache-Control sono disponibili varie opzioni (o "direttive") che influiscono sulla modalità di memorizzazione nella 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 di utilizzo: 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 di utilizzo: Cache-Control: max-age=600, s-maxage=300

Tutti i browser moderni supportano l'intestazione Cache-Control. Tuttavia, alcune vecchie intestazioni obsolete sono obsolete e obsolete e provengono da HTTP/1.0, il che può ancora avere un effetto sulla memorizzazione nella cache. Le intestazioni sono Scadenza 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 sulle intestazioni Last-Modified(response) / If-Modified-Since (request) e ETag (risposta) / If-None-Match (richiesta).

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 memorizzerà nella cache le risposte né eseguirà la riconvalida in presenza di un certificato non attendibile o non valido.

Nota sul dispatcher:

C'è un problema con AEM Dispatcher v4.2.3 e versioni precedenti in cui /enableTTL viene memorizzato nella cache utilizzando solo la direttiva max-age. Ciò significa che anche quando sono impostate private o s-maxage direttive, la cache rimarrebbe comunque attiva se è impostata max-age. Questo problema è stato risolto in Dispatcher 4.2.4 e versioni successive.

B. Memorizzazione in cache della rete CDN

Una rete 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 gli hop 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 rete CDN, devi assolutamente incorporarne una 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 sull'intestazione Cache-Control HTTP response e in genere tornano all'intestazione Expires se non viene trovata alcuna intestazione Cache-Control.

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 rete 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 le direttive stale-while-revalidate e stale-if-error nell'intestazione Cache-Control.

    • 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 - in modo analogo, questa direttiva indica alla rete CDN di distribuire la versione precedente (già memorizzata nella cache) del file quando l'origine risponde con un errore durante la riconvalida.
  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.

    • Attiva 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.

    • IIS di Microsoft - Usa 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, è possibile controllarlo tramite la configurazione < dynamicTypes>.
    • Se il provider CDN supporta Inclusioni lato Edge (ESI), utilizza questa funzione. I componenti AEM possono essere suddivisi utilizzando ESI. A tale scopo, utilizzare Apache \[ Sling Dynamic Includes\] o implementare 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 all'intestazione di risposta Vary. In alcuni casi, Vary può causare il salto completo della cache sia della rete CDN che del browser. Come regola empirica generale, evita di aggiungere Vary ad eccezione di Vary: 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 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 di Dispatcher per 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, consulta questo articolo per informazioni dettagliate su come ottimizzare la cache del dispatcher.

D. Istanze Publish dell’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, è possibile utilizzare ACS Commons - Dispatcher TTL oppure implementare un codice personalizzato per impostarlo.
    2. Ultima modifica - Se il contenuto della pagina è relativamente statico, ad esempio un articolo, è possibile impostare l'ultima intestazione modificata sulla data/ora cq:lastModified (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 decidi di utilizzare questo elemento invece di Ultima modifica, puoi 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. Utilizza 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. Il caching può essere eseguito con le seguenti tecnologie:

        • Inclusioni lato Edge (ESI) 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 della funzionalità 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 la proprietà jsProcessor di tipo String[ ] con valore min:none
      2. e impostare la proprietà cssProcessor di tipo String[ ] con valore min:none
      3. Ulteriori dettagli, qui.
    3. Incorpora le librerie client per minimizzare e ridurre i file js e css.

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

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