A resposta de Shane acima é melhor que esta. Esta é uma solução alternativa que é mais complicada e tem problemas adicionais. Por favor, envie a resposta de Shane, não esta. Estou apenas mostrando outro método para resolver o problema.
Meu pensamento inicial foi return (pass);
in vcl_recv
e, depois que a solicitação foi buscada, em vcl_fetch
, de alguma forma instruímos Varnish que deveria armazenar o objeto em cache, até mesmo foi especificamente passado anteriormente.
Acontece que isso não é possível :
If you chose to pass the request in an earlier VCL function (e.g.:
vcl_recv), you will still execute the logic of vcl_fetch, but the
object will not enter the cache even if you supply a cache time.
Assim, a próxima melhor coisa é acionar uma pesquisa como uma solicitação normal, mas certifique-se de que ela sempre falhe. Não há como influenciar o processo de busca, então ele sempre vai funcionar (assumindo que é armazenado em cache; se não estiver, ele vai perder e armazenar de qualquer maneira). Mas podemos influenciar vcl_hit
:
sub vcl_hit {
# is this our spider?
if (req.http.user-agent ~ "Wget" && client.ip ~ spider) {
# it's the spider, so purge the existing object
set obj.ttl = 0s;
return (restart);
}
return (deliver);
}
Não podemos forçar a não utilização do cache, mas podemos remover esse objeto do cache e reiniciar todo o processo. Agora ele volta ao começo, em vcl_recv
, onde eventualmente faz outra pesquisa. Como removemos o objeto que estamos tentando atualizar, ele não será executado, buscaremos os dados e atualizaremos o cache.
Um pouco complicado, mas funciona. A única janela para um usuário ficar preso entre uma limpeza e a resposta que está sendo armazenada é o tempo para a única solicitação ser processada. Não é perfeito, mas é muito bom.