Otimização dos caches do site do AEM

Descrição

Ambiente

Adobe Experience Manager

Problemas/Sintomas

Otimizar o armazenamento em cache na arquitetura 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 de AEM.

Arquitetura e armazenamento em cache do AEM

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 AEM padrão.  Isso inclui as instâncias de Navegador da Web, CDN, Dispatcher e AEM.
screenshot_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 do site é o próprio navegador.  O armazenamento em cache no nível do navegador geralmente é feito por meio de Cache-Control: max-age=… resposta cabeçalho.  A variável max-age Essa configuração informa ao navegador por quantos segundos o arquivo deve ser armazenado em cache antes de tentar "revalidar" ou solicitá-lo do site novamente.  Esse conceito de cache max-age geralmente é chamado de "Expiração de cache" ou TTL ("Time to Live").

Existem várias opções (ou "diretivas") dentro do Controle de cache que afetam como ocorre o armazenamento em cache.  Estas são algumas diretivas comuns:

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

    Exemplo de uso:

      Cache-Control: max-age=300, privado

  2. ​s-maxage - o s-maxage diretiva no Controle de cache permite definir um TTL diferente para caches compartilhados, como CDNs.  Quando esse valor é definido, o navegador usa o que está definido em max-age e outros caches respeitariam a 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 a partir de HTTP/1.0, o que ainda pode ter efeito no armazenamento em cache.  Esses cabeçalhos são Expira e Pragma.  Se você não precisar de suporte a 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 da Última modificação (resposta) / Se modificado desde (solicitação), e a variável ETag (resposta) / If-None-Match (solicitação) cabeçalhos.

Cuidado em testes de navegador:

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

Observação sobre o dispatcher:

Há um problema com o AEM Dispatcher v4.2.3 e versões anteriores em que o /enableTTL somente caches que usam max-age diretiva.  Isto significa que, mesmo quando privado ou s-maxage diretivas são definidas ainda armazenaria em cache se max-age está definido.  Esse problema é resolvido no Dispatcher 4.2.4 e nas versões posteriores.

Armazenamento em cache do CDN

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

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

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 resposta cabeçalho e geralmente retornam ao Expira cabeçalho se não Controle de cache cabeçalho encontrado.

A maioria dos 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 têm seus arquivos.

Otimização do uso do CDN

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

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

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

  • Ativar a compactação GZip no nível do Dispatcher: Apache - use mod_deflate.  Tenha cuidado para o uso da Vary por mod_deflate.  Em certos casos, o cabeçalho Vary pode fazer com que o 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 pelo < dynamicTypes> configuração.

  • Se o provedor de CDN oferecer suporte a Inclusões da borda (ESI) em seguida, utilize esse recurso. Os componentes do AEM podem ser quebrados usando 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á disponibilizando conteúdo mais dinâmico em algumas partes da página. Nesses casos, você está quebrando a página em vários arquivos CDN. Dessa forma, você pode armazenar em cache diferentes partes da página por diferentes períodos.

Provedores de CDN populares

Veja a seguir uma lista de alguns provedores de CDN populares:

Há várias outras, cada uma com diferentes recursos.

Cuidado:

Tenha cuidado com o Variar cabeçalho de resposta.  Em certos casos, Variar pode fazer com que o CDN e o navegador ignorem totalmente o cache.  Como regra geral, evite adicionar Variar exceto para Vary: 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 ou desktop, use um URL diferente.  Isso permitirá que CDNs e navegadores armazenem em cache com mais eficiência.

Armazenamento em cache do Dispatcher do AEM

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

Como este é 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 do 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. Cache-Control: max-age=… - Para definir esse cabeçalho, ACS Commons - Dispatcher TTL poderia ser usado ou você poderia implementar um código personalizado para configurá-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 de última modificação como 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, será melhor configurá-la para usar a data/hora atuais.
    3. ETag - Se você decidir usar em vez de Última modificação, você poderia escrever um ReplicationEventListener que acompanha as ativações da 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 dinâmica ou fizer referência a um conteúdo, a ETag terá que ser omitida (ou calculada).
  2. Se o site tiver conteúdo personalizado/dinâmico:

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

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

        1. Edge-Side Includes (ESI) na CDN
        2. SSI (Server-Side Includes) no servidor da Web
        3. Ou Asynchronous Javascript and 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 de cache HTTP do ACS Commons.

  3. Otimizar bibliotecas do cliente.

    1. Ativar minificação nas 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:nenhum
      2. e defina a propriedade cssProcessor do tipo String[ ] com valor min:nenhum
      3. Veja mais detalhes, aqui.
    3. Incorporar cliente bibliotecas para minificar 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