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-stale
cache-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
- Na Google Cloud consola, aceda à página Equilíbrio de carga.
- Clique no nome do seu Application Load Balancer externo.
- Clique em Editar.
- Para a Configuração de back-end, selecione um back-end e, de seguida, clique em Editar.
- Certifique-se de que a opção Ativar RFC está selecionada.
- Na parte inferior da janela, clique em Configurações avançadas.
- 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
- Clique em Atualizar.
- 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
- Na Google Cloud consola, aceda à página Equilíbrio de carga.
- Clique no nome do seu Application Load Balancer externo.
- Clique em Editar.
- Para a Configuração de back-end, selecione um back-end e, de seguida, clique em Editar.
- Certifique-se de que a opção Ativar RFC do Google Cloud não está selecionada.
- Na parte inferior da janela, clique em Configurações avançadas.
- Para Opções adicionais de CDN > Publicar enquanto estiver desatualizado, selecione Desativar publicação enquanto estiver desatualizado.
- Clique em Atualizar.
- 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 }