如何从 URL 中提取值并检查缓存以在清漆中加载数据

How to extract value from URL and check cache to load data in varnish

我有一个场景,我的 URL 要么包含有值的逗号分隔符,要么没有。 即 /api/parameters/XXXXXXXXXX?tables=x0 或 tables=x0;x1;x2.

现在基于此 URL 我想检查清漆,如果 URL 包含多个值作为 table 然后将其分开并传递每个 table 名称单独 URL (/api/parameters/XXXXXXXXXX?tables=x0, /api/parameters/XXXXXXXXXX?tables=x1, /api/parameters/XXXXXXXXXX?tables=x2) 如果未命中则缓存到后端服务器。

然后根据这个需要的response把结果return给client。 我的问题是:

  1. 如何从 URL 中分离值并将修改后的 URL 传递给 varnish 缓存或后端。
  2. 在 return 处理结果后,我想 return 它作为组合的 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 querystring 参数的值数量设置上限,并且您必须使用单独的 if-statements.[= 检查值21=]

返回组合的 JSON 输出

从各种 URL 获取结果后,您可以创建一个 JSON 字符串并通过 return(synth(200,req.http.json)) return 它。其中 req.http.json 包含 JSON 字符串。

这将创建一个综合响应。

Varnish Enterprise中也可以缓存合成输出。请参阅 https://docs.varnish-software.com/varnish-cache-plus/vmods/synthbackend/ 以了解有关 vmod_synthbackend 的更多信息。

清漆企业免责声明

我在回答中建议的解决方案使用 Varnish Enterprise,即 Varnish 的商业版本。它通过附加的 VMOD 和特性扩展了 Varnish 的功能,您可以阅读 here。如果您有兴趣,无需预先支付许可费用即可试用的一种简单方法是在云基础设施上启动一个实例: