对被禁对象使用宽限模式

Use Grace Mode for banned objects

我们正在努力改进我们的清漆缓存设置。我们的后端应用程序相当慢,因此我们希望最大限度地提高访问者的点击率。如果缓存内容过时一段时间通常不是问题,因此这里响应性能优先于当前性。

基础知识就是这些,它们很容易用通常的 VCL 设置实现:

现在是我们正在努力解决的问题。当发出 ban() 时,它会使缓存的对象完全无效。下一个请求将传递到后端。我们想阻止这种情况。

在这种情况下,我们想要的是类似于宽限模式的处理。当我们告诉 Varnish “忘记所有以 /products 开头的 URL”时,它应该使用现有的缓存对象,但将它们视为 TTL 已过期。因此,受影响的 URL 的第一个访问者将获得陈旧的缓存结果(立即,同时 Varnish 检索新结果),但第二个访问者将获得新结果。

我知道如果我们正在处理单个对象,我们可以用 req.hash_always_miss 做这样的事情,但是我们怎么能用大量的 objects/URLs 来做呢?由于项目的结构,我们没有所有 URL 的详尽列表。当我们需要更新缓存时,向 Varnish 发出数千个请求似乎非常令人望而却步。

简而言之:有没有办法在对所有现有对象使用宽限模式时“禁止”对象(基于 URL 正则表达式)以确保快速响应时间?

遗憾的是没有软禁功能。

我唯一能给你的是 soft purge 函数,它是 vmod_purge 的一部分,但它不支持正则表达式。

有关详细信息,请参阅 http://varnish-cache.org/docs/6.0/reference/vmod_generated.html#func-soft。虽然不是你要找的,但聊胜于无。

这是 VCL 代码:

vcl 4.1;

import purge;

sub vcl_recv {
    if(req.method == "SOFTPURGE") {
        return(hash);
    }
}

sub vcl_hit {
    if(req.method == "SOFTPURGE") {
        purge.soft(0s,100s);
    }
}