Invalidar páginas em cache do AEM

Ao usar o Dispatcher com AEM, a interação deve ser configurada para garantir um gerenciamento eficaz do cache. Dependendo do seu ambiente, a configuração também pode aumentar o desempenho.

Configuração AEM contas de usuário

A conta de usuário padrão admin é usada para autenticar os agentes de replicação instalados por padrão. Você deve criar uma conta de usuário dedicada para uso com agentes de replicação.

Para obter mais informações, consulte a seção Configurar usuários de replicação e transporte da Lista de verificação de segurança do AEM.

Invalidando o Cache do Dispatcher do Ambiente de Criação

Um agente de replicação na instância do autor AEM envia uma solicitação de invalidação de cache para o Dispatcher quando uma página é publicada. A solicitação faz com que o Dispatcher eventualmente atualize o arquivo no cache à medida que novo conteúdo é publicado.

Use o seguinte procedimento para configurar um agente de replicação na instância do autor AEM para invalidar o cache do Dispatcher na ativação da página:

  1. Abra o console Ferramentas AEM. (https://localhost:4502/miscadmin#/etc)

  2. Abra o agente de replicação necessário abaixo de Ferramentas/replicação/Agentes no autor. Você pode usar o agente do Dispatcher Flush instalado por padrão.

  3. Clique em Editar e, na guia Configurações, verifique se Ativado está selecionado.

  4. (opcional) Para ativar solicitações de invalidação de alias ou caminho personalizado, selecione a opção Atualização de alias.

  5. Na guia Transporte, digite o URI necessário para acessar o Dispatcher.
    Se você estiver usando o agente padrão do Dispatcher Flush, provavelmente será necessário atualizar o nome do host e a porta; por exemplo, https://<dispatcherHost>:<portApache>/dispatcher/invalidate.cache

    Observação: para agentes do Dispatcher Flush, a propriedade URI é usada somente se você usar entradas de host virtual baseadas em caminho para diferenciar entre fazendas. Use esse campo para público alvo do farm para invalidar. Por exemplo, o farm #1 tem um host virtual de www.mysite.com/path1/* e o farm #2 tem um host virtual de www.mysite.com/path2/*. Você pode usar um URL de /path1/invalidate.cache para público alvo do primeiro farm e /path2/invalidate.cache para público alvo do segundo farm. Para obter mais informações, consulte Usando o Dispatcher com Vários Domínios.

  6. Configure outros parâmetros, conforme necessário.

  7. Clique em OK para ativar o agente.

Como alternativa, você também pode acessar e configurar o agente do Dispatcher Flush a partir de AEM Touch UI.

Para obter mais detalhes sobre como ativar o acesso a URLs personalizados, consulte Ativando o acesso a URLs personalizados.

OBSERVAÇÃO

O agente para liberar o cache do dispatcher não precisa ter um nome de usuário e senha, mas se configurado, eles serão enviados com autenticação básica.

Há dois problemas potenciais com essa abordagem:

  • O Dispatcher deve estar acessível a partir da instância de criação. Se sua rede (por exemplo, o firewall) estiver configurada de modo que o acesso entre os dois seja restrito, isso pode não ser o caso.

  • A publicação e a invalidação do cache ocorrem ao mesmo tempo. Dependendo do tempo, um usuário pode solicitar uma página logo depois de ela ter sido removida do cache e antes da nova página ser publicada. AEM agora retorna a página antiga e o Dispatcher armazena em cache novamente. Isso é mais um problema para sites grandes.

Invalidando o Cache do Dispatcher de uma Instância de Publicação

Em determinadas circunstâncias, os ganhos de desempenho podem ser obtidos com a transferência do gerenciamento de cache do ambiente de criação para uma instância de publicação. Em seguida, será o ambiente de publicação (não o ambiente de criação de AEM) que envia uma solicitação de invalidação de cache ao Dispatcher quando uma página publicada for recebida.

Essas circunstâncias incluem:

OBSERVAÇÃO

A decisão de usar este método deve ser tomada por um administrador AEM experiente.

O despacho do dispatcher é controlado por um agente de replicação que opera na instância de publicação. No entanto, a configuração é feita no ambiente de criação e, em seguida, transferida por meio da ativação do agente:

  1. Abra o console Ferramentas AEM.

  2. Abra o agente de replicação necessário abaixo de Ferramentas/replicação/Agentes ao publicar. Você pode usar o agente do Dispatcher Flush instalado por padrão.

  3. Clique em Editar e, na guia Configurações, verifique se Ativado está selecionado.

  4. (opcional) Para ativar solicitações de invalidação de alias ou caminho personalizado, selecione a opção Atualização de alias.

  5. Na guia Transporte, digite o URI necessário para acessar o Dispatcher.
    Se você estiver usando o agente padrão do Dispatcher Flush, provavelmente será necessário atualizar o nome do host e a porta; por exemplo, http://<dispatcherHost>:<portApache>/dispatcher/invalidate.cache

    Observação: para agentes do Dispatcher Flush, a propriedade URI é usada somente se você usar entradas de host virtual baseadas em caminho para diferenciar entre fazendas. Use esse campo para público alvo do farm para invalidar. Por exemplo, o farm #1 tem um host virtual de www.mysite.com/path1/* e o farm #2 tem um host virtual de www.mysite.com/path2/*. Você pode usar um URL de /path1/invalidate.cache para público alvo do primeiro farm e /path2/invalidate.cache para público alvo do segundo farm. Para obter mais informações, consulte Usando o Dispatcher com Vários Domínios.

  6. Configure outros parâmetros, conforme necessário.

  7. Repita o procedimento para cada instância de publicação afetada.

Após a configuração, ao ativar uma página do autor para publicar, esse agente inicia uma replicação padrão. O registro inclui mensagens indicando solicitações provenientes do servidor de publicação, semelhantes ao exemplo a seguir:

  1. <publishserver> 13:29:47 127.0.0.1 POST /dispatcher/invalidate.cache 200

Invalidando manualmente o Cache do Dispatcher

Para invalidar (ou liberar) o cache do Dispatcher sem ativar uma página, é possível emitir uma solicitação HTTP para o dispatcher. Por exemplo, você pode criar um aplicativo AEM que permite que os administradores ou outros aplicativos liberem o cache.

A solicitação HTTP faz com que o Dispatcher exclua arquivos específicos do cache. Como opção, o Dispatcher atualiza o cache com uma nova cópia.

Excluir arquivos em cache

Emita uma solicitação HTTP que faz com que o Dispatcher exclua arquivos do cache. O Dispatcher armazena os arquivos em cache novamente somente quando recebe uma solicitação do cliente para a página. A exclusão de arquivos em cache dessa maneira é apropriada para sites que provavelmente não receberão solicitações simultâneas para a mesma página.

A solicitação HTTP tem o seguinte formulário:

POST /dispatcher/invalidate.cache HTTP/1.1  
CQ-Action: Activate  
CQ-Handle: path-pattern
Content-Length: 0

O Dispatcher limpa (exclui) os arquivos e pastas em cache que têm nomes que correspondem ao valor do cabeçalho CQ-Handler. Por exemplo, um CQ-Handle de /content/geomtrixx-outdoors/en corresponde aos seguintes itens:

  • Todos os arquivos (de qualquer extensão de arquivo) nomeados en no diretório geometrixx-outdoors

  • Qualquer diretório chamado " _jcr_content" abaixo do diretório en (que, se existir, contém renderizações em cache de subnós da página)

Todos os outros arquivos no cache do dispatcher (ou até um nível específico, dependendo da configuração /statfileslevel) são invalidados tocando no arquivo .stat. A última data de modificação do arquivo é comparada à última data de modificação de um documento em cache e o documento é buscado novamente se o arquivo .stat for mais recente. Consulte Invalidando arquivos pelo nível de pasta para obter detalhes.

A invalidação (ou seja, o toque de arquivos .stat) pode ser impedida pelo envio de um cabeçalho adicional CQ-Action-Scope: ResourceOnly. Isso pode ser usado para liberar recursos específicos sem invalidar outras partes do cache, como dados JSON que são criados dinamicamente e que exigem o descarte regular independente do cache (por exemplo, a representação de dados obtidos de um sistema de terceiros para exibir notícias, indicadores de ações etc.).

Excluir e registrar arquivos

Emita uma solicitação HTTP que faz com que o Dispatcher exclua arquivos em cache e recupere e armazene imediatamente o arquivo em cache. Exclua e recoloque imediatamente os arquivos quando os sites provavelmente receberão solicitações simultâneas do cliente para a mesma página. O cache imediato garante que o Dispatcher recupere e armazene a página em cache apenas uma vez, em vez de uma vez para cada solicitação de cliente simultânea.

Observação: a exclusão e o cache de arquivos devem ser executados somente na instância de publicação. Quando executadas a partir da instância do autor, as condições de raça ocorrem quando as tentativas de recuperar recursos ocorrem antes de serem publicados.

A solicitação HTTP tem o seguinte formulário:

POST /dispatcher/invalidate.cache HTTP/1.1  
CQ-Action: Activate   
`Content-Type: text/plain  
CQ-Handle: path-pattern  
Content-Length: numchars in bodypage_path0

page_path1 
...  
page_pathn

Os caminhos de página para serem imediatamente armazenados em cache são listados em linhas separadas no corpo da mensagem. O valor de CQ-Handle é o caminho de uma página que invalida as páginas para cache. (Consulte o parâmetro /statfileslevel do item de configuração Cache.) A seguinte mensagem de solicitação HTTP de exemplo exclui e armazena em cache /content/geometrixx-outdoors/en.html page:

POST /dispatcher/invalidate.cache HTTP/1.1  
CQ-Action: Activate  
Content-Type: text/plain   
CQ-Handle: /content/geometrixx-outdoors/en/men.html  
Content-Length: 36

/content/geometrixx-outdoors/en.html

Exemplo de servlet flush

O código a seguir implementa um servlet que envia uma solicitação de invalidação para o Dispatcher. O servlet recebe uma mensagem de solicitação que contém handle e page parâmetros. Esses parâmetros fornecem o valor do cabeçalho CQ-Handle e o caminho da página para cache, respectivamente. O servlet usa os valores para construir a solicitação HTTP para o Dispatcher.

Quando o servlet é implantado na instância de publicação, o seguinte URL faz com que o Dispatcher exclua a página /content/geometrixx-outdoors/en.html e, em seguida, armazene uma nova cópia em cache.

10.36.79.223:4503/bin/flushcache/html?page=/content/geometrixx-outdoors/en.html&handle=/content/geometrixx-outdoors/en/men.html

OBSERVAÇÃO

Este exemplo de servlet não é seguro e demonstra apenas o uso da mensagem de solicitação HTTP Post. Sua solução deve proteger o acesso ao servlet.

package com.adobe.example;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Service;
import org.apache.felix.scr.annotations.Property;

import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingSafeMethodsServlet;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.StringRequestEntity;

@Component(metatype=true)
@Service
public class Flushcache extends SlingSafeMethodsServlet {

 @Property(value="/bin/flushcache")
 static final String SERVLET_PATH="sling.servlet.paths";

 private Logger logger = LoggerFactory.getLogger(this.getClass());

 public void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) {
  try{ 
      //retrieve the request parameters
      String handle = request.getParameter("handle");
      String page = request.getParameter("page");

      //hard-coding connection properties is a bad practice, but is done here to simplify the example
      String server = "localhost"; 
      String uri = "/dispatcher/invalidate.cache";

      HttpClient client = new HttpClient();

      PostMethod post = new PostMethod("https://"+host+uri);
      post.setRequestHeader("CQ-Action", "Activate");
      post.setRequestHeader("CQ-Handle",handle);
   
      StringRequestEntity body = new StringRequestEntity(page,null,null);
      post.setRequestEntity(body);
      post.setRequestHeader("Content-length", String.valueOf(body.getContentLength()));
      client.executeMethod(post);
      post.releaseConnection();
      //log the results
      logger.info("result: " + post.getResponseBodyAsString());
      }
  }catch(Exception e){
      logger.error("Flushcache servlet exception: " + e.getMessage());
  }
 }
}

Nesta página