如何在Varnish执行ban规则时为匹配缓存对象启用Grace Mode
可实现的落地方案
核心逻辑是放弃原生ban()直接删除匹配缓存对象的特性,改用软失效标记+Grace逻辑触发的组合方案,仅标记匹配规则的缓存为「已过期」但保留对象副本,触发原有Grace逻辑返回旧内容的同时后台异步更新,完全避免首个请求透传后端的问题。
开源版Varnish配置步骤
无需额外安装第三方模块,基于原生VCL逻辑即可实现:
1. 给缓存对象添加生成时间标记
在后端响应阶段给每个写入缓存的对象打上生成时间戳,用于后续软失效规则匹配:
sub vcl_backend_response { # 原有缓存配置、Grace宽限期配置保留 # 新增:缓存对象添加生成时间标记 set beresp.http.X-Cache-Generated = now; # 按需设置宽限期,示例为24小时 set beresp.grace = 24h; }
2. 新增缓存命中阶段的软失效判定逻辑
修改vcl_hit段,匹配到软失效规则的缓存对象强制重置TTL为0,自动触发Grace逻辑:
sub vcl_hit { # 原有命中逻辑保留 # 软失效规则匹配:示例为匹配所有/products前缀的URL、生成时间早于指定失效时间点的缓存 # 可通过varnishadm动态更新正则规则与失效时间点,无需重载VCL if (req.url ~ "^/products" && obj.http.X-Cache-Generated < "2024-05-20T12:00:00") { set obj.ttl = 0s; } # TTL过期且仍在宽限期内的对象直接返回,同时后台触发异步更新 if (obj.ttl <= 0s && obj.grace > 0s) { return (deliver); } }
动态下发批量正则软失效规则的方法
如果需要动态更新软失效规则,无需每次修改VCL重载,可通过vmod_var模块存储全局软失效规则,通过varnishadm命令动态更新规则与失效时间点即可。
商业版Varnish Plus快捷方案
如果使用商业版可直接调用内置Soft Purge功能,给purge请求加上X-Soft-Purge: 1头即可实现正则批量软失效,自动将匹配对象TTL置0触发Grace逻辑,无需额外自定义VCL。
该方案完全兼容你现有缓存配置,不需要全量遍历URL触发预热,所有匹配规则的缓存首次被访问时自动触发后台异步更新,用户全程无感知,不会出现请求延迟。
内容的提问来源于stack exchange,提问作者user17334621
相关产品推荐
相关产品推荐

