对被禁对象使用宽限模式
Use Grace Mode for banned objects
我们正在努力改进我们的清漆缓存设置。我们的后端应用程序相当慢,因此我们希望最大限度地提高访问者的点击率。如果缓存内容过时一段时间通常不是问题,因此这里响应性能优先于当前性。
基础知识就是这些,它们很容易用通常的 VCL 设置实现:
- 缓存中不存在的内容将照常从后端检索。
- 存在于其 TTL 内缓存中的内容将从缓存中传送。
- 缓存中存在但早于 TTL 的内容应以宽限模式传送,即缓存将在后台更新,而陈旧内容将传送到客户端。 (对于我们的场景,宽限期会相当长,因此可以确保访问者获得缓存结果。我们将采用某种形式的缓存预热来在需要时缓存新内容。)
- 为了使后端更新可见,我们使用了相当常见的禁令,例如:
ban("req.http.host ~ (?i)[www\.example\.com|www\.example\.net] && req.url ~ ^/products/?$");
。我们的项目有很多域和 URL,因此这为我们提供了合理的特异性,因此我们不必一直使整个缓存无效。
现在是我们正在努力解决的问题。当发出 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);
}
}
我们正在努力改进我们的清漆缓存设置。我们的后端应用程序相当慢,因此我们希望最大限度地提高访问者的点击率。如果缓存内容过时一段时间通常不是问题,因此这里响应性能优先于当前性。
基础知识就是这些,它们很容易用通常的 VCL 设置实现:
- 缓存中不存在的内容将照常从后端检索。
- 存在于其 TTL 内缓存中的内容将从缓存中传送。
- 缓存中存在但早于 TTL 的内容应以宽限模式传送,即缓存将在后台更新,而陈旧内容将传送到客户端。 (对于我们的场景,宽限期会相当长,因此可以确保访问者获得缓存结果。我们将采用某种形式的缓存预热来在需要时缓存新内容。)
- 为了使后端更新可见,我们使用了相当常见的禁令,例如:
ban("req.http.host ~ (?i)[www\.example\.com|www\.example\.net] && req.url ~ ^/products/?$");
。我们的项目有很多域和 URL,因此这为我们提供了合理的特异性,因此我们不必一直使整个缓存无效。
现在是我们正在努力解决的问题。当发出 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);
}
}