如何使用Varnish vcl语言实现此行为(按键引导字典)

时间:2018-10-23 10:53:34

标签: varnish varnish-vcl

我已经尝试了所有我能想到的,没有任何效果,这是我需要做的:

我有一个相当复杂的应用程序,它依赖于能够根据用户帐户提供内容的“节点”列表,我有很多节点。

假设我有以下节点“ n ”:

  • n1
  • n2
  • n3

这些帐户“ a ”(及其文件“ f ”):

  • a1:f1,f2
  • a2:f3,f4
  • a3:f5

并非所有节点都存储所有文件,因此,例如,这里的文件存储方式(文件可以存储在一个或多个节点上,具体取决于帐户存储冗余):

 n1:   , f2, f3,   , f5
 n2: f1,   , f3, f4, f5
 n3: f1, f2,   , f4,   

正如您在此处看到的那样,每个文件都在2个节点上可用。

现在当客户访问其内容时:GET /account/{a1}/files/{f1}我需要清漆才能将用户转发到 n2 n3

这里的问题是我需要很多导演“ d ”(每个文件一个):

  • d1:n2,n3
  • d2:n1,n3
  • d3:n1,n2
  • d4:n2,n3
  • d5:n1,n2

当然,此列表是完全动态的(某些基于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]
}

请随时询问详细信息,我们很乐意提供这些信息。

1 个答案:

答案 0 :(得分:0)

因此,企业版已打包vmod_kvstorehttps://docs.varnish-software.com/varnish-cache-plus/vmods/kvstore/#get-backend),但是您需要订阅或获取并运行官方实例映像(AWS市场或您使用的任何云平台,如果您用一个)

或者,我前段时间写了这个vmod:https://github.com/gquintard/libvmod-stendhal,但是您必须检查它是否适用于您的版本,进行编译并自行安装。