varnish - 对禁止对象使用宽限模式
问题描述
我们正在尝试改进我们的清漆缓存设置。我们的后端应用程序相当慢,因此我们希望最大限度地提高访问者的点击率。如果缓存的内容过时一段时间,这通常不是问题,因此这里的响应性能优先于当前性。
基础是这些,它们很容易通过通常的 VCL 设置实现:
- 缓存中不存在的内容将照常从后端检索。
- 缓存中存在于其 TTL 内的内容将从缓存中传送。
- 缓存中存在但早于 TTL 的内容应以宽限模式交付,即缓存将在后台更新,同时将过时的内容交付给客户端。(对于我们的场景,宽限期会相当长,因此可以确保访问者获得缓存的结果。我们将在需要时采用某种形式的缓存预热来缓存新内容。)
- 为了使后端更新可见,我们使用了相当常见的禁令,例如:
ban("req.http.host ~ (?i)[www\.example\.com|www\.example\.net] && req.url ~ ^/products/?$");
. 我们的项目有许多域和 URL,因此这为我们提供了合理的特异性,因此我们不必一直使整个缓存无效。
现在是我们正在努力解决的问题。发出aban()
时,它将完全使缓存的对象无效。下一个请求将被传递到后端。我们想防止这种情况发生。
在这种情况下,我们想要的是类似宽限模式的处理。当我们告诉 Varnish“忘记所有以 /products 开头的 URL”时,它应该使用现有的缓存对象,但将它们视为 TTL 已过期。因此,受影响 URL 的第一个访问者将获得陈旧的缓存结果(立即,而 Varnish 检索一个新结果),但第二个访问者将获得一个新结果。
我知道如果我们正在处理单个对象,我们可以使用 req.hash_always_miss 执行类似的操作,但是我们如何使用大量对象/URL 来执行此操作?由于项目的结构,我们没有所有 URL 的详尽列表。当我们需要更新缓存时,向 Varnish 发出很可能数千个请求似乎非常令人望而却步。
简而言之:有没有办法“禁止”对象(基于 URL 正则表达式),同时对所有现有对象使用宽限模式以确保快速响应时间?
解决方案
不幸的是,没有软禁令功能。
我唯一能给你的是一个软清除功能,它是 的一部分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);
}
}
推荐阅读
- r - 对于 r 中的每种情况,将索引范围变为 0
- excel - 二维数组的动态上限
- xamarin - 如何在 Xamarin 表单中自定义 AutoCompleteTextView
- sql - 如何编写一种方法来为 SQL 和数组构建查询?
- java - 如何在我的 java 代码中实现 Haystack java 工具包库?
- react-native - 如何使用 react-native 设置 Sentry-cli 源映射
- r - 使用 dplyr 汇总特定列
- jquery - 是否有可能知道星星是否亮起?(jQuery Raty 插件)
- azure - 是否可以通过 azure 中的 ansible 覆盖或创建新版本的秘密?
- powershell - VSTS 托管代理 2017:在构建定义中运行用于 Dll 版本控制的 Powershell 脚本