Otimização AEM caches do site

Descrição

Ambiente

  • Experience Manager

Problemas/sintomas
Otimizar o armazenamento em cache na arquitetura de AEM é uma das maneiras mais rápidas de obter um grande aumento de desempenho.  Este artigo se concentra em explicar como otimizar os vários caches disponíveis em uma arquitetura AEM.

Arquitetura AEM e armazenamento em cache

Em todas as arquiteturas AEM, o usuário encontra várias camadas de cache ao visitar seu site.  Há quatro camadas de cache a serem consideradas em uma arquitetura de AEM padrão.  Isso inclui as instâncias do Navegador da Web, CDN, Dispatcher e AEM.
captura de tela_2018-03-25160541

Resolução

Armazenamento em cache do navegador

O primeiro nível de cache que um usuário encontra em uma visita repetida de seu site é seu próprio navegador.  O armazenamento em cache no nível do navegador geralmente é feito por meio da variável Controle de cache: max-age=… response header.  O max-age informa ao navegador em quantos segundos ele deve armazenar o arquivo em cache antes de tentar "revalidar" ou solicitá-lo novamente ao site.  Esse conceito de cache max-age geralmente é chamado de "Expiração do cache" ou TTL ("Tempo de vida útil").

Há várias opções (ou "diretivas") no Controle de cache que afetam como o armazenamento em cache ocorre.  Aqui estão algumas diretivas comuns:

  1. private - o private na diretiva Controle de cache faz com que o arquivo seja armazenado em cache somente no navegador, não em caches intermediários, como CDNs.  Um uso prático para esta diretiva seria se sua página incluísse conteúdo personalizado/específico do usuário.

    Exemplo de uso:

      Controle de cache: max-age=300, private

  2. ​ s-maxage - o s-maxage na diretiva Controle de cache permite definir um TTL diferente para caches compartilhados, como CDNs.  Quando esse valor é definido, o navegador usaria o que é definido em max-age e outros caches respeitariam s-maxage em vez disso.

    Exemplo de uso:

      Controle de cache: max-age=600, s-maxage=300

Todos os navegadores modernos são compatíveis com o Controle de cache no entanto, alguns cabeçalhos obsoletos antigos existem no HTTP/1.0, o que pode ainda ter um efeito no armazenamento em cache.  Esses cabeçalhos são Expira e Pragma.  Se você não precisar suportar navegadores muito antigos, não envie esses cabeçalhos de resposta.
Além do armazenamento em cache, a revalidação também é um conceito importante.  A revalidação depende do Última modificação (response) / If-Modified-Since (solicitação) e os cabeçalhos ETag (resposta) / Se-Nenhum-Corresponder Cabeçalhos (solicitação).

Cuidado:

Teste do navegador:

Ao testar o armazenamento em cache no Google Chrome, se você estiver testando por https e tiver um certificado autoassinado, nada será armazenado em cache.  O Chrome não armazenará respostas em cache nem executará a revalidação quando houver um certificado não confiável ou inválido.

Nota sobre o dispatcher:

Há um problema com AEM Dispatcher v4.2.3 e versões anteriores em que a função /enableTTL somente caches usando max-age diretiva.  Isso significa que, mesmo quando private ou s-maxage as diretivas estão definidas, ele ainda armazenaria em cache se max-age está definida.  Esse problema é resolvido no Dispatcher 4.2.4 e em versões posteriores.

Armazenamento em cache do CDN

CDN ou "Rede de entrega de conteúdo", é uma rede distribuída de servidores da Web projetados para armazenar em cache e veicular conteúdo do local mais próximo de seus usuários.  Isso reduz o salto da rede e a distância do computador do usuário para o seu conteúdo, reduzindo assim "Round Trip Time" (RTT).  RTT é o tempo que o navegador leva para enviar uma solicitação ao seu site e receber uma resposta.  A concorrência no espaço do provedor CDN tornou as CDNs muito econômicas.  Isso torna fácil a decisão de usar uma CDN para seu site.  Se você ainda não estiver usando uma CDN, então definitivamente deverá incorporar uma CDN em seu site.

Há muitos provedores de CDN, cada um oferece recursos e configurações diferentes.

COMO FUNCIONA O ARMAZENAMENTO EM CACHE DO CDN

As CDNs armazenam conteúdo em cache seguindo regras semelhantes aos navegadores.  Eles dependem do Controle de cache HTTP response e geralmente retorne ao Expira cabeçalho se não Controle de cache é encontrado.

A maioria das CDNs fornece alguma maneira de acionar uma liberação manual do cache.  Em muitos casos, as liberações de cache têm algum atraso (por exemplo, 15 minutos) em relação à propagação para todos os servidores de borda que tenham seus arquivos.

Otimizando o uso da CDN

Há algumas coisas a serem feitas para garantir que você esteja armazenando arquivos em cache de maneira ideal no CDN:

  1. Use uma CDN compatível com a stale-while-revalidate stale-if-error nas diretivas Controle de cache cabeçalho.

    • stale-while-revalidate - esta diretiva diz à CDN para servir a versão antiga (já armazenada em cache) do arquivo enquanto ela recupera uma nova após o arquivo de cache ter expirado.
    • stale-if-error - da mesma forma, esta diretiva diz à CDN para servir a versão antiga (já armazenada em cache) do arquivo quando a origem responde com um erro durante a revalidação.
  2. Respostas de compactação GZip para todos os tipos de arquivo que não são pré-compactados.
    Você deve fazer isso a partir do nível do dispatcher.  Isso garantirá que você reduza o número de bytes enviados para a CDN.  As CDNs normalmente cobram por bytes transferidos, portanto, compactar as respostas reduz o custo.

  • Ative a compactação GZip no nível do Dispatcher: Apache - use mod_deflate.  Tenha cuidado com o uso do Vary pelo mod_deflate.  Em certos casos, o cabeçalho Vary pode fazer com que a CDN e o navegador ignorem totalmente o armazenamento em cache.

  • Microsoft IIS - use Compactação dinâmica.

  • Não permita a compactação gzip de arquivos grandes ou arquivos que já estejam compactados.  Observe que a maioria dos formatos de imagem e vídeo já está pré-compactada.  Compactá-los dinamicamente no nível do servidor da Web tem um custo muito alto para o desempenho.

    • No Apache, isso pode ser feito por meio da diretiva AddOutputFilterByType :

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

    • No IIS, isso pode ser controlado pela variável configuração dynamicTypes.

  • Se o seu provedor CDN suportar Inclusões do lado da borda (ESI) em seguida, utilize esse recurso. AEM componentes podem ser desmembrados usando o ESI. Para fazer isso, use o Apache Sling Dynamic Includes(https://github.com/Cognifide/Sling-Dynamic-Include) ou implemente uma solução personalizada. É útil quando você tem páginas bastante estáticas, mas está veiculando conteúdo mais dinâmico em algumas partes da página. Nesses casos, você está essencialmente dividindo a página em vários arquivos CDN. Dessa forma, é possível armazenar em cache diferentes partes da página por diferentes períodos de tempo.

Provedores de CDN populares

Aqui está uma lista de alguns provedores populares de CDN:

Cuidado:

Tenha cuidado com o Vary cabeçalho de resposta.  Em certos casos, Vary O pode fazer com que a CDN e o navegador ignorem totalmente o armazenamento em cache.  Como regra geral, evite adicionar Vary exceto para Variável: Accept-Encoding (aplicado somente quando a resposta é compactada por gzip).  Em outras palavras, se você precisar "variar" a saída de uma resposta, use um URL diferente.

Por exemplo, se você tiver uma versão diferente do HTML para dispositivos móveis e desktop, use um URL diferente.  Isso permitirá que CDNs e navegadores armazenem em cache com mais eficiência.

AEM Armazenamento em Cache do Dispatcher

Se o cache CDN tiver expirado, a solicitação alcançará o cache do dispatcher AEM.  Neste nível, há muitas coisas que podem ser feitas para otimizar o armazenamento em cache.

Como esse é um tópico maior, consulte este artigo para obter detalhes sobre como otimizar o cache do dispatcher.

Instâncias de publicação do AEM

No nível de AEM, há algumas coisas que devem ser feitas para otimizar as várias camadas de cache:

  1. Defina os seguintes cabeçalhos de resposta HTTP que não são definidos por AEM por padrão.

    1. Controle de cache: max-age=… - Para definir esse cabeçalho, ACS Commons - Dispatcher TTL poderia ser usado ou você poderia implementar um código personalizado para defini-lo.
    2. Última modificação - Se o conteúdo da página for relativamente estático, como um artigo, você poderá definir seu cabeçalho da última modificação para cq:lastModified date/time (última vez que o artigo foi modificado).  No entanto, se a página for dinâmica com os resultados da consulta JCR contidos no conteúdo do componente, seria melhor configurá-la para usar a data/hora atuais.
    3. ETag - se decidir utilizar este medicamento em vez de Última modificação, você poderia escrever um ReplicationEventListener que escuta as ativações de página e gera um hash md5 do conteúdo da página.  Isso pode ser definido como uma propriedade no nó jcr:content da página na instância do autor.  Quando as páginas são replicadas, elas são enviadas para as instâncias de publicação.  Para componentes de página com conteúdo relativamente estático, isso pode funcionar bem, no entanto, se a página for um pouco dinâmica ou fizer referência a muito conteúdo, o ETag precisará ser omitido (ou calculado).
  2. Se o site tiver conteúdo personalizado/dinâmico:

    1. Use Apache Sling Dynamic Inclues para dividir o conteúdo para que diferentes partes da página possam ser armazenadas em cache por diferentes períodos de tempo.

      1. O armazenamento em cache pode ser feito com as seguintes tecnologias:

        1. Edge-side Includes (ESI) na CDN
        2. Server-side Includes (SSI) no servidor da Web
        3. Ou, Javascript assíncrono e XML (AJAX) no navegador
      2. Os componentes na página podem ser divididos em solicitações separadas, que podem ser armazenadas em cache por diferentes períodos de tempo.  Partes da página que são relativamente estáticas podem ser armazenadas em cache por períodos muito mais longos.

    2. Considere usar o Recurso HTTP Cache do ACS Commons.

  3. Otimizar bibliotecas de clientes.

    1. Ativar minificação em bibliotecas de clientes.

    2. Se os arquivos na biblioteca do cliente forem pré-minificados, desative a minificação nessa biblioteca do cliente.  Edite o nó cq:ClientLibraryFolder :

      1. Definir propriedade jsProcessor do tipo String com valor min:none
      2. e definir propriedade cssProcessor do tipo String com valor min:none
      3. Veja mais detalhes, here.
    3. Incorporar cliente bibliotecas para minimizar e reduzir arquivos js e css.

    4. Implementar versioned-clientlibs do ACS Commons para permitir que o CDN e o Dispatcher armazenem arquivos js e css em cache por períodos mais longos.

Nesta página