Openresty: выполнение двух асинхронных задач
Я работаю над проблемой с дизайном сервиса, который по сути является перенаправлением.
Ссылка на запрос, которую я получу, будет содержать несколько параметров (abc.com/param1=v1¶m2=v2). Мне нужно сделать две задачи по этой ссылке
Мне нужно отформатировать ссылку и перенаправить пользователя в другой домен с некоторыми переданными параметрами (xyz.com/p1=v2) в зависимости от значения, скажем, param1. Этот шаг должен быть максимально быстрым
Мне нужно сохранить детали ссылки на мою БД после некоторой обработки.
Я планирую сделать это с помощью комбинации nginx+lua(openresty)+(Redis или Mongodb?).
Поскольку эти две задачи не связаны, я планирую разделить их, чтобы выполнить обе задачи асинхронно.
В качестве первой задачи в перенаправлении ngx.redirect("/link") кажется подходящим для этого случая. Но в документации говорится, что вызов перенаправления прекратит обработку текущего запроса
Как я могу сделать эти две задачи независимыми, и перенаправление произойдет настолько быстро, насколько это возможно, и не должно ждать завершения второй задачи.
1 ответ
Можно ли сделать хранение выполненным другим потоком и как передать это задание другому потоку?
Да, конечно, вы можете это сделать, в первую очередь вы должны хорошо понять директиву модуля порядка lua, а затем, чтобы сделать ваш процесс Mongodb в отдельном потоке, вы должны вызывать с помощью ngx.location.capture ($url), где $url - это URL в вашем блоке местоположений:
location redirect/handling {
... //
content_by_lua_file url/to/your/code/forRedirectHandling
ngx.location.capture(mongo/save):
}
location mongo/save {
content_by_lua_file url/to/mongodbHandlingdCode
}
Ngx.location.capture() укажет на ваш второй блок местоположения и сделает ваш код в другом потоке (рабочий nginx).
Просьба ознакомиться с документацией openresty, чтобы узнать, какую директиву использовать (access_by_lua, log_by_lua...)
надеюсь, это поможет:)