Я перепробовал все, что мог придумать, ничего не получилось, вот что мне нужно сделать:
У меня довольно сложное приложение, которое опирается на список «узлов», которые могут обслуживать контент в зависимости отв учетной записи пользователя у меня много узлов.
Допустим, у меня есть эти узлы " n ":
И эти учетные записи " 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]
}
Пожалуйста, не стесняйтесь спрашивать подробности, я буду рад предоставить их.