首页 > 解决方案 > 对禁止对象使用宽限模式

问题描述

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

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

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

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

我知道如果我们正在处理单个对象,我们可以使用 req.hash_always_miss 执行类似的操作,但是我们如何使用大量对象/URL 来执行此操作?由于项目的结构,我们没有所有 URL 的详尽列表。当我们需要更新缓存时,向 Varnish 发出很可能数千个请求似乎非常令人望而却步。

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

标签: varnishvarnish-vcl

解决方案


不幸的是,没有软禁令功能。

我唯一能给你的是一个软清除功能,它是 的一部分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);
    }
}

推荐阅读