Otimização dos caches do site do AEM

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.

Descrição description

Ambiente

Adobe Experience Manager

Problemas/Sintomas

Como otimizar os caches do site do 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 do Navegador da Web, CDN, Dispatcher e AEM.

Resolução resolution

A. 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 do Cache-Control: max-age=… response header. A configuração max-age 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 é comumente chamado de "Expiração do cache" ou TTL ("Tempo de vida").

Há várias opções (ou "diretivas") no cabeçalho Cache-Control que afetam como o armazenamento em cache ocorre. Estas são algumas diretivas comuns:

  1. private — a diretiva private no cabeçalho Cache-Control a torna de forma 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, private

  2. s-maxage - a diretiva s-maxage no cabeçalho Cache-Control permite definir um TTL diferente para caches compartilhados, como CDNs. Quando esse valor for definido, o navegador usará o que está definido em max-age e outros caches respeitarão a configuração s-maxage.

    Exemplo de uso: Cache-Control: max-age=600, s-maxage=300

Todos os navegadores modernos oferecem suporte ao cabeçalho Cache-Control. No entanto, alguns cabeçalhos obsoletos antigos existem de HTTP/1.0, o que ainda pode ter efeito no armazenamento em cache. Estes cabeçalhos são Expires 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 dos cabeçalhos Last-Modified(response) / If-Modified-Since (request) e ETag (response) / If-None-Match (solicitação).

Cuidado no teste do 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 armazenará em cache respostas ou executará a revalidação quando houver 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 armazena em cache somente usando a diretiva max-age. Isso significa que mesmo quando as diretivas private ou s-maxage são definidas, ele ainda armazenará em cache se max-age estiver definido. Esse problema é resolvido no Dispatcher 4.2.4 e nas versões posteriores.

B. Armazenamento em cache do CDN

Uma CDN ou "Rede de Entrega de Conteúdo" é uma rede distribuída de servidores Web projetada para armazenar em cache e veicular conteúdo do local mais próximo aos seus usuários. Isso reduz os saltos de rede e a distância do computador do usuário ao seu conteúdo, reduzindo assim o "Tempo 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 uma CDN, incorpore definitivamente uma CDN ao seu site.

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

Como funciona o Cache do CDN?

As CDNs armazenam conteúdo em cache seguindo regras semelhantes aos navegadores. Eles dependem do cabeçalho Cache-Control HTTP response e geralmente retornam ao cabeçalho Expires se nenhum cabeçalho Cache-Control for 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.

Otimizando o Uso da 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 que ofereça suporte às diretivas stale-while-revalidate e stale-if-error no cabeçalho Cache-Control.

    • stale-while-revalidate - esta diretiva informa ao CDN para fornecer a versão antiga (já armazenada em cache) do arquivo enquanto ele recupera uma nova depois que o arquivo de cache expirou.
    • 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.

    • Habilite 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 pela configuração < dynamicTypes>.
    • Se o seu provedor de CDN oferece suporte a Inclusões do Edge (ESI), use esse recurso.Os componentes do AEM podem ser quebrados usando ESI. Para fazer isso, use Apache \[ Sling Dynamic Includes\] 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 populares de CDN

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

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

Atenção:

Tenha cuidado com o cabeçalho de resposta Vary. Em certos casos, Vary pode fazer com que a CDN e o navegador ignorem totalmente o cache. Como regra geral, evite adicionar Vary exceto por 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.

C. AEM Dispatcher Caching

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.

D. Instâncias AEM Publish

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 este cabeçalho, ACS Commons - Dispatcher TTL pode ser usado, ou você pode 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ê pode definir seu cabeçalho de última modificação para a data/hora cq:lastModified (a ú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 usá-lo em vez de Last-Modified, poderá gravar um ReplicationEventListener que escute ativações de página e gere 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. Use o Apache Sling Dynamic Includes para 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:

        • Edge-side Includes (ESI) na CDN
        • SSI (Server-Side Includes) no servidor da Web
        • 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 de Cache HTTP do ACS Commons.

  3. Otimizar bibliotecas do cliente.

    1. Ative minificação nas bibliotecas do cliente.

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

      1. Defina a propriedade jsProcessor do tipo String[ ] com o valor min:none
      2. e defina a propriedade cssProcessor do tipo String[ ] com o valor min:none
      3. Veja mais detalhes, aqui.
    3. Incorpore bibliotecas de clientes para minificar e reduzir arquivos js e css.

    4. Implemente 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.

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