Балансировка по содержимому 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).