我已经尝试了所有我能想到的,没有任何效果,这是我需要做的:
我有一个相当复杂的应用程序,它依赖于能够根据用户帐户提供内容的“节点”列表,我有很多节点。
假设我有以下节点“ n ”:
这些帐户“ a ”(及其文件“ f ”):
并非所有节点都存储所有文件,因此,例如,这里的文件存储方式(文件可以存储在一个或多个节点上,具体取决于帐户存储冗余):
n1: , f2, f3, , f5
n2: f1, , f3, f4, f5
n3: f1, f2, , f4,
正如您在此处看到的那样,每个文件都在2个节点上可用。
现在当客户访问其内容时:GET /account/{a1}/files/{f1}
我需要清漆才能将用户转发到 n2 或 n3 。
这里的问题是我需要很多导演“ d ”(每个文件一个):
当然,此列表是完全动态的(某些基于Redis事件的配置生成器或领事模板不存在此问题),但是选择正确的Director是个地狱(假设用于选择文件的URL为GET /account/{aX}/files/{fX}
) :
sub vcl_recv {
if (req.url ~ "/files/f1$") {
req.backend_hint = d1.backend()
}
else if (req.url ~ "/files/f2$") {
req.backend_hint = d2.backend()
}
else if (req.url ~ "/files/f3$") {
req.backend_hint = d3.backend()
}
else if (req.url ~ "/files/f4$") {
req.backend_hint = d4.backend()
}
else if (req.url ~ "/files/f5$") {
req.backend_hint = d5.backend()
}
}
该应用程序可提供数千个文件,因此如果无法维护,则很难维护。
我认为所做的事情有些变化(但是用清漆vcl languange无法找到方法),例如定义字典(伪代码):
sub vcl_init {
# pseudo code down here
set directors_dict = dict(
"f1"=[d1],
"f2"=[d2],
"f3"=[d3],
"f4"=[d4],
"f5"=[d5]
)
}
sub vcl_recv {
set req.http.file_id = regsub(<extract file id from url>)
set req.backend_hint = directors_dict[req.http.file_id]
}
请随时询问详细信息,我们很乐意提供这些信息。
答案 0 :(得分:0)
因此,企业版已打包vmod_kvstore
(https://docs.varnish-software.com/varnish-cache-plus/vmods/kvstore/#get-backend),但是您需要订阅或获取并运行官方实例映像(AWS市场或您使用的任何云平台,如果您用一个)
或者,我前段时间写了这个vmod:https://github.com/gquintard/libvmod-stendhal,但是您必须检查它是否适用于您的版本,进行编译并自行安装。