webserver-llc/angie

Балансировка по содержимому Request body

Opened this issue · 1 comments

У меня работает телеграм-бот в режиме web-hook (100-300 RPS входящих).
В качестве реверс-проски использую nginx
Так как сервер телеграма нельзя попросить присылать запросы не несколько endpoint я не могу "кластеризовать" свой бекенд
В запросе от сервера всегда вот такой JSON (в одну строку):

{"update_id":56351,"message":{"message_id":28,"from":{"id":111,"username":"aaaa},"**chat":{"id":-100111222333,**"title":"Some chat",...

Есть ли какой модуль, похожий на http_upstream
который бы "балансировал" запросы по "бекендам" в зависимости от тела сообщения, например
а) если в теле есть подстрока 'chat":{"id":-100111222333,' -> backend1
б_ иначе -> backend2
?

Сейчас я для тестирования использую второй бот, но это неудобно в плане отправки заранее заготовленных ресурсов (file_id и т.п.)

Можно воспользоваться методом балансировки hash, где в качестве значения брать подстроку из тела.

Либо использовать sticky в режиме route, где в качестве значения брать производную от подстроки из тела, пропущенную через map или split_clients - на входе переменная с телом, в которой ищется подстрока, а на выходе будет sid сервера.

Тело запроса будет в переменной $request_body. Может понадобиться также включение директивы client_body_in_single_buffer и увеличение client_body_buffer_size. Найти в теле какую-то подстроку можно с помощью директивы map с регулярным выражением, в котором, в том числе, можно использовать т.н. группы захвата (captures).