Apresente conteúdo desatualizado

Esta página fornece informações sobre a publicação de conteúdo obsoleto e expirado com a RFC na nuvem. A publicação de conteúdo desatualizado permite que a cache global da Google continue a publicar conteúdo quando o seu servidor de origem está inacessível ou está a devolver erros ao Cloud CDN.

Os motivos para o fazer são os seguintes:

  • Prefere publicar conteúdo desatualizado para os utilizadores em vez de devolver erros aos utilizadores.
  • A publicação de conteúdo desatualizado evita a latência quando a cache recebe um pedido de conteúdo que acabou de expirar. Em vez de ter de aguardar uma revalidação síncrona no back-end, a cache disponibiliza o conteúdo desatualizado que acabou de expirar, enquanto aciona uma revalidação separada.

Para ativar este comportamento, o seu back-end pode especificar a diretiva stale-while-revalidate no cabeçalho Cache-Control da resposta. Em seguida, o Cloud CDN vai fornecer esse conteúdo a partir da cache (se disponível) durante o número de segundos especificado após a hora de expiração da entrada de cache. De forma assíncrona, o Cloud CDN valida novamente o conteúdo com a origem.

O Cloud CDN ativa esta opção em seu nome com a definição cdnPolicy.serveWhileStale. Esta definição determina durante quanto tempo, após a expiração da resposta, o Cloud CDN pode continuar a publicar uma versão desatualizada. Se não for especificado de outra forma na resposta, este valor é 86400s (1 dia).

O Cloud CDN não suporta a diretiva stale-if-error. Esta diretiva indica à cache que evite publicar conteúdo obsoleto, a menos que a revalidação síncrona com o back-end tenha falhado com códigos de estado de erro específicos.

Os valores predefinidos, mínimos e máximos são os seguintes:

  • Predefinição: 86 400 segundos (um dia)
  • Mínimo: 0 segundos (desativa a funcionalidade)
  • Máximo: 604 800 segundos (uma semana)

O conteúdo obsoleto é publicado até ao limite especificado após a hora de expiração da entrada na cache, que é definida pelos cabeçalhos max-age, s-maxage ou Expires. Para mais informações, consulte o artigo Tempos de expiração e pedidos de validação.

Se uma cache de extremidade do Cloud CDN não tiver uma cópia em cache do objeto para fornecer conteúdo obsoleto ou o objeto tiver atingido o TTL obsoleto máximo, o Cloud CDN revalida o conteúdo de forma síncrona com a origem. Se a origem devolver um erro nesse momento, a RFC devolve o erro de origem.

Registo e agente do utilizador

Os pedidos assíncronos feitos pela RFC na nuvem aparecem no seu servidor de origem exatamente como os pedidos de revalidação normais que ocorrem quando não serve conteúdo desatualizado. A exceção é que estejam etiquetados com um cabeçalho User-Agent que contenha Cloud-CDN-Google.

Os pedidos assíncronos também são registados separadamente no Cloud Logging, pelo que um pedido de utilizador publicado como obsoleto gera duas entradas de registo: a primeira para o conteúdo realmente publicado para o utilizador e a segunda para o pedido de revalidação à origem. Tal como as revalidações síncronas, a RFC na nuvem pode enviar um pedido condicional em algumas circunstâncias ou apenas pedir novamente o conteúdo incondicionalmente. Em qualquer dos casos, o código de resposta registado no Cloud Logging corresponde ao pedido original ao Cloud CDN; por exemplo, um 200 OK para um pedido incondicional ou um 304 Not Modified se a resposta original do utilizador for condicional.

Diretiva de pedido do cliente max-stale

Os clientes podem pedir um tempo de serviço obsoleto mais curto especificando uma diretiva max-stalecache-control. Se especificada, esta diretiva controla a quantidade de dados desatualizados que o cliente tolera.

Se o conteúdo em cache estiver mais desatualizado do que o valor max-stale do cliente, o Cloud CDN volta a validar o conteúdo antes de o disponibilizar.

O cliente não pode pedir um valor max-stale superior ao valor configurado com a opção de configuração serve-while-stale e a diretiva stale-while-revalidate cache-control da origem.

Antes de começar

  • Leia sobre os modos de cache e o conteúdo estático.

  • Certifique-se de que o Cloud CDN está ativado. Para obter instruções, consulte o artigo Usar o Cloud CDN.

  • Se necessário, atualize para a versão mais recente da CLI Google Cloud:

    gcloud components update
    

Publicar conteúdo desatualizado durante a revalidação

Consola

  1. Na Google Cloud consola, aceda à página Equilíbrio de carga.

    Aceda a Balanceamento de carga

  2. Clique no nome do seu Application Load Balancer externo.
  3. Clique em Editar.
  4. Para a Configuração de back-end, selecione um back-end e, de seguida, clique em Editar.
  5. Certifique-se de que a opção Ativar RFC está selecionada.
  6. Na parte inferior da janela, clique em Configurações avançadas.
  7. Para Opções adicionais da RFC, selecione uma das seguintes opções para Publicar enquanto estiver obsoleto:
    • 1 minuto
    • 5 minutos
    • 10 minutos
    • 30 minutos
    • 1 dia (recomendado)
    • 7 dias
  8. Clique em Atualizar.
  9. Clique novamente em Atualizar.

gcloud

Para buckets de back-end, use o comando gcloud compute backend-buckets create ou o comando gcloud compute backend-buckets update com a flag --serve-while-stale.

Para serviços de back-end, use o comando gcloud compute backend-services create ou o comando gcloud compute backend-services update com a flag --serve-while-stale.

gcloud compute backend-buckets (create | update) BACKEND_BUCKET_NAME
    --serve-while-stale=SECONDS
gcloud compute backend-services (create | update) BACKEND_SERVICE_NAME
    --serve-while-stale=SECONDS

Por exemplo:

gcloud compute backend-services update my-backend-service
    --serve-while-stale=180s

API

Para contentores de back-end, use a chamada da API Method: backendBuckets.insert ou Method: backendBuckets.update.

Para serviços de back-end, use a chamada da API Method: backendServices.insert ou Method: backendServices.update.

Use uma das seguintes chamadas da API:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets
PUT https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/BACKEND_BUCKET
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices
PUT https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE

Adicione o seguinte fragmento ao corpo do pedido JSON:

"cdnPolicy": {
  "serveWhileStale": SECONDS
}

Desative a publicação de conteúdo desatualizado

Consola

  1. Na Google Cloud consola, aceda à página Equilíbrio de carga.

    Aceda a Balanceamento de carga

  2. Clique no nome do seu Application Load Balancer externo.
  3. Clique em Editar.
  4. Para a Configuração de back-end, selecione um back-end e, de seguida, clique em Editar.
  5. Certifique-se de que a opção Ativar RFC do Google Cloud não está selecionada.
  6. Na parte inferior da janela, clique em Configurações avançadas.
  7. Para Opções adicionais de CDN > Publicar enquanto estiver desatualizado, selecione Desativar publicação enquanto estiver desatualizado.
  8. Clique em Atualizar.
  9. Clique novamente em Atualizar.

gcloud

Para contentores de back-end, use o comando gcloud compute backend-buckets create ou gcloud compute backend-buckets update com o valor da flag --serve-while-stale definido como 0.

Para serviços de back-end, use o comando gcloud compute backend-services create ou o comando gcloud compute backend-services update com o valor da flag --serve-while-stale definido como 0.

gcloud compute backend-services (create | update) (BACKEND_SERVICE_NAME | BACKEND_BUCKET_NAME)
    --serve-while-stale=0

API

Para contentores de back-end, use a chamada da API Method: backendBuckets.insert ou Method: backendBuckets.update.

Para serviços de back-end, use a chamada da API Method: backendServices.insert ou Method: backendServices.update.

Use uma das seguintes chamadas da API:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets
PUT https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/BACKEND_BUCKET
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices
PUT https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE

Adicione o seguinte fragmento ao corpo do pedido JSON:

"cdnPolicy": {
  "serveWhileStale": 0
}