Как добиться такого поведения с помощью языка Varnish vcl (словарь директоров по ключу) - PullRequest
0 голосов
/ 23 октября 2018

Я перепробовал все, что мог придумать, ничего не получилось, вот что мне нужно сделать:

У меня довольно сложное приложение, которое опирается на список «узлов», которые могут обслуживать контент в зависимости отв учетной записи пользователя у меня много узлов.

Допустим, у меня есть эти узлы " 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 .

Проблема здесьчто мне нужно много директоrs " d " (по одному на файл):

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

И, конечно, этот список является полностью динамическим (не проблема с некоторыми событиями redis)основанный генератор конфигурации или консул-шаблоны), но выбор правильного директора - это ад (предположим, 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()
  }
}

Приложение обслуживает тысячи файлов, так что если / иначев некоторой степени невозможно поддерживать ..

То, что я думал, делает кое-что немного более развитое (но не смог найти способ с использованием языка VARK лака), например, определение словаря (псевдокод):

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 голосов
/ 29 октября 2018

Итак, версия Enterprise имеет пакет vmod_kvstore (https://docs.varnish -software.com / varnish-cache-plus / vmods / kvstore / # get-backend ), но вам потребуется подпискаили чтобы получить и запустить официальный образ экземпляра (рынок AWS или любую облачную платформу, которую вы используете, если вы ее используете)

В качестве альтернативы есть такой vmod, который я написал некоторое время назад: https://github.com/gquintard/libvmod-stendhal, но вы 'Вам придется проверить, работает ли он для вашей версии, скомпилировать и установить его самостоятельно.

...