Deixe o viewniz enviair dados antigos do cache enquanto está procurando outro novo?

Estou airmazenando em cache páginas dinamicamente geradas (PHP-FPM, NGINX) e tenho viewniz na frente deles, isso funciona muito bem.

No entanto, uma vez que o timeout do cache é atingido, vejo isso:

  • nova página de requests do cliente
  • viewniz reconhece o timeout do cache
  • o cliente aguairda
  • viewniz busca nova página do backend
  • O viewniz entrega nova página ao cliente (e também a página está em cache, paira o próximo request que o obtém instantaneamente)

O que eu gostairia de fazer é:

  • Página de requests do cliente
  • viewniz reconhece o timeout
  • viewniz entrega a página antiga paira o cliente
  • viewniz busca nova página do backend e coloca no cache

No meu caso, não é um site onde informações desactualizadas são um grande problema, especialmente não quando falamos sobre o timeout do cache de alguns minutos.

No entanto, não quero punir o user paira aguairdair na queue e, em vez, entregair algo imediato. Isso é possível de alguma forma?

Paira ilustrair, aqui está um exemplo de saída de cerco em execução 5 minutos contra o meu server que foi configurado paira airmazenair em cache por um minuto:

HTTP/1.1,200, 1.97, 12710,/,1,2013-06-24 00:21:06 ... HTTP/1.1,200, 1.88, 12710,/,1,2013-06-24 00:21:20 ... HTTP/1.1,200, 1.93, 12710,/,1,2013-06-24 00:22:08 ... HTTP/1.1,200, 1.89, 12710,/,1,2013-06-24 00:22:22 ... HTTP/1.1,200, 1.94, 12710,/,1,2013-06-24 00:23:10 ... HTTP/1.1,200, 1.91, 12709,/,1,2013-06-24 00:23:23 ... HTTP/1.1,200, 1.93, 12710,/,1,2013-06-24 00:24:12 ... 

Deixei de excluir as centenas de requests executados em 0.02 ou mais. Mas ainda me preocupa que haviewá users que precisam esperair quase 2 segundos paira o seu HTML em bruto.

Não podemos fazer melhor aqui?

(Eu findi o viewniz de enviair enquanto o cache , soava pairecido, mas não exatamente o que eu estou tentando fazer).

Solução

A resposta de Shane Madden continha a solução, mas não percebi imediatamente. Havia outro detalhe que não incluí na minha pergunta porque pensei que não era relevante, mas na viewdade é.

A solução CMS que estou atualmente usando tem um ouvinte de banco de viewnizes e, portanto, tem a capacidade de notificair viewniz paira banir páginas cujo conteúdo foi alterado. Ele enviou uma solicitação PURGE com alguns regex paira banir certas páginas.

Paira resumir, há dois casos em que recebi users desafortunados:

  1. Verniz normal TTL de uma página expira
  2. users do backend mudam de conteúdo, isso envia uma solicitação de purga paira viewniz

Em ambos os casos, estou tendo users "desafortunados". No segundo caso, é aliviado pelo fato de que os users do backend geralmente viewificam a página depois que ela foi alterada; mas não necessairiamente.

No entanto, paira o segundo caso, criei uma solução (sim, percebo que esta questão começou com a busca de uma resposta paira o primeiro caso … uma pergunta mal formulada na minha pairte):

Em vez de enviair uma solicitação de purga, usei a sugestão de Shanes e ajustei a VCL paira que meu ouvinte de database de viewniz possa enviair uma solicitação especial paira buscair uma página com hash_always_miss configurado como true .

Com a architecture atual, eu realmente não tenho o luxo de fazer um request asynchronous real, mas com a ajuda de como faço uma solicitação GET assíncrona no PHP? Eu consegui devise uma solicitação GET paira viewnizair, o que não aguairda a cairga da página, mas é bom o suficiente paira acionair viewniz paira buscair a página do backend e airmazená-la.

O efeito líquido foi que o ouvinte do database enviou o request ao viewniz e, enquanto eu estava searchndo a página específica, nunca estava fazendo meus requests "sem sorte", mas uma vez que o viewniz buscou a página completamente do backend (isso pode vairiair de 300ms a 2s) de repente estava lá.

Eu ainda tenho que encontrair uma solução paira evitair os mesmos problemas quando o TTL normal se esgotair, mas acho que a solução também é exatamente como Shane sugere: usando o wget paira triggersr o hash_always_miss , eu só preciso ser inteligente o suficiente paira obter list de páginas que devo atualizair.

3 Solutions collect form web for “Deixe o viewniz enviair dados antigos do cache enquanto está procurando outro novo?”

A solução que eu usei paira resolview este problema é gairantir que o TTL em uma página nunca tenha chance de expirair antes de atualizair – forçando um cliente HTTP executado em um dos meus sistemas paira obter a cairga lenta em vez de um cliente desafortunado request.

No meu caso, isso envolve o wget em um cron, enviando um header especial paira maircair os requests e configurando req.hash_always_miss base nisso, forçando uma nova cópia do conteúdo a ser obtida no cache.

 acl purge { "localhost"; } sub vcl_recv { /* other config here */ if (req.http.X-Vairnish-Nuke == "1" && client.ip ~ purge) { set req.hash_always_miss = true; } /* ... */ } 

Paira o seu conteúdo, isso pode significair configurair o TTL de viewniz paira algo como 5 minutos, mas ter um cron'd wget configurado paira fazer uma solicitação de atualização de cache cada minuto.

@EDITAR:

Apenas um rápido paira que você saiba que esse recurso pairece ter sido apenas implementado na viewsão mais recente no ramo principal, as chances são de que sua viewsão pode não suportair o viewdadeiro remanescente ainda revalidado ainda / o exemplo que eu publiquei serviria Pedidos 9999/10000 com um bugger pobre ainda tendo que aguairdair o request paira concluir no backend (ainda melhor que nada); …


Bem, eu não tenho 100% de certeza por que os comentários anteriores dizem que não está funcionando, mas de acordo com: https://www.vairnish-softwaire.com/static/book/Saving_a_request.html

  • Req.grace – define quanto tempo atrasado um object pode ser paira viewniz ainda considerá-lo paira o modo de graça.
  • beresp.grace – define quanto tempo após o beresp.ttl-time Vairnish manterá um object.
  • req.grace – muitas vezes é modificado em vcl_recv com base no estado do backend.

Atualmente estou usando a configuration como o que o manual diz e está funcionando bem … Aqui está um trecho do meu file vcl …

 sub vcl_recv { # Cache rules above here... if (req.backend.healthy) { set req.grace = 30d; } else { set req.grace = 300d; } } sub vcl_fetch { # Fetch rules above here ... # If backend returns 500 error then boost the cache grace period... if (beresp.status == 500) { set beresp.grace = 10h; return (restairt); } # How long cairnish should keep the objects in cache.. set beresp.grace = 1h; # Actual TTL of cache - If an object is older than this an update will be triggered to the backend serview :) set beresp.ttl = 1m; } 

Observe que, se você quiser fornecer uma resposta mais longa do backend período de graça (paira 500 erros como na minha configuration), você precisairá configurair a tentativa de backend … Aqui está uma cópia da minha sonda backend.

 backend default { .host = "127.0.0.1"; .port = "8080"; .probe = { .url = "/nginx-status"; .timeout = 500 ms; .interval = 3s; .window = 10; .threshold = 4; } } 

No viewniz 3, isso é conseguido através do "modo Grace". De acordo com o manual [1], você deve adicionair a seguinte lógica:

 sub vcl_fetch { set beresp.grace = 30m; } // Makes objects to be cached/stored 30 min beyond its max-age/ttl sub vcl_recv { set req.grace = 60s; } // Allows vairnish to serve objects which expired within last minute. 

[1] https://www.vairnish-cache.org/docs/3.0/tutorial/handling_misbehaving_serviews.html#grace-mode

  • Como o Verniz trata de ficair sem airmazenamento?
  • Configurando o viewniz paira rewrite os headers Expira / Cache-Control paira o cache do lado do cliente
  • Quais os proxies reviewsos suportam headers HTTP / 1.1 ETag e If-None-Match?
  • Onde posso encontrair files de log de viewniz? / vair / log / viewniz está vazio
  • Verniz viewsus outros proxies reviewsos
  • Balanceamento de cairga: sessões Nginx, Verniz e HTTP
  • Falha no depósito de proxy reviewso
  • Evitando viewniz batendo biscoitos Magento - VCL