问题描述
我有一个场景,我的 URL 将包含一个带值或不带值的逗号分隔符。 即 /api/parameters/XXXXXXXXXX?tables=x0 或 tables=x0;x1;x2。
现在基于这个 URL 我想检查清漆,如果 URL 包含多个值作为表然后将其分开并在单独的 URL 中传递每个表名 (/api/parameters/XXXXXXXXXXX?tables=x0,/api /parameters/XXXXXXXXXX?tables=x1,/api/parameters/XXXXXXXXXX?tables=x2) 如果未命中则缓存然后后端服务器。
然后根据本次需要的响应组合结果返回给客户端。 我的问题是:
- 如何从 URL 中分离值并将修改后的 URL 传递到 varnish 缓存或后端。
- 返回结果后,我想将其作为组合 JSON 对象返回,按照最初使用逗号分隔符请求的顺序(即 x0 结果;x1 结果;x2 结果)。
解决方法
在 Varnish 中可以将单个请求转换为多个子请求。不幸的是,开源版本无法做到这一点,只能使用企业版。
vmod_http
https://docs.varnish-software.com/varnish-cache-plus/vmods/http/ 描述了如何使用 vmod_http
从 Varnish 中执行 HTTP 调用。
通过 Varnish 向其他 URL 发送 HTTP 请求,你可以从缓存中取出多个对象,并将它们聚合成一个响应
无循环
Varnish 没有循环的事实使事情变得更加复杂。因此,您必须为 tables
查询字符串参数具有的值数量设置上限,并且您必须使用单独的 if 语句检查这些值。
返回组合的 JSON 输出
从各种 URL 获取结果后,您可以创建一个 JSON 字符串并通过 return(synth(200,req.http.json))
返回它。其中 req.http.json
包含 JSON 字符串。
这将创建一个综合响应。
在Varnish Enterprise 中,还可以缓存合成输出。请参阅 https://docs.varnish-software.com/varnish-cache-plus/vmods/synthbackend/ 以了解有关 vmod_synthbackend
的更多信息。
Varnish Enterprise 免责声明
我在回答中建议的解决方案使用 Varnish Enterprise,这是 Varnish 的商业版本。它通过额外的 VMOD 和功能扩展了 Varnish 功能,您可以阅读有关 here 的内容。如果您有兴趣,可以在无需预付许可费用的情况下试用它的一种简单方法是在云基础架构上启动一个实例: