如何在Varnish中基于响应大小缓存?Chunked编码场景怎么处理?
默认无法在vcl_backend_response阶段直接获取Transfer-Encoding: Chunked类型响应的完整大小,该阶段Varnish仅完成响应头的接收,尚未拉取响应体,此时beresp.body_length会返回-1,无有效判断依据。
可行解决方案
方案1:关闭流式响应,强制拉取完整响应后判断大小
该方案无需额外安装扩展,适合Varnish 6.0及以上所有版本,配置示例如下:vcl_backend_response { # 关闭流式响应,Varnish会先接收完整响应体再做后续处理 set beresp.do_stream = false; # 自定义缓存大小阈值,示例为10MB,可根据需求调整 if (beresp.body_length > 10 * 1024 * 1024) { # 超过阈值不缓存 set beresp.ttl = 0s; set beresp.uncacheable = true; return (deliver); } # 低于阈值的响应正常配置缓存规则 set beresp.ttl = 1h; set beresp.http.Cache-Control = "public, max-age=3600"; }注意该方案会小幅增加响应延迟,因为Varnish需要等完整响应接收完成后才会发送给客户端,大响应场景下会额外占用Varnish的存储资源。
方案2:使用第三方
vmod_bodyaccess扩展
如果你需要保留流式响应的低延迟特性,可以安装第三方VMODbodyaccess,该模块可以在响应传输过程中实时统计响应体大小,支持Chunked编码的响应,你可以在vcl_deliver阶段基于统计到的完整大小回溯调整缓存策略。方案3:上游InfluxDB侧适配
你可以调整InfluxDB的HTTP服务配置,对于常规大小的查询请求关闭Chunked编码,主动返回Content-Length头,就可以直接在vcl_backend_response阶段通过头信息判断大小,无需调整Varnish侧的传输逻辑。
内容的提问来源于stack exchange,提问作者Yash Mandhyan
相关产品推荐
相关产品推荐

