Openresty: выполнение двух асинхронных задач

Я работаю над проблемой с дизайном сервиса, который по сути является перенаправлением.

Ссылка на запрос, которую я получу, будет содержать несколько параметров (abc.com/param1=v1¶m2=v2). Мне нужно сделать две задачи по этой ссылке

  1. Мне нужно отформатировать ссылку и перенаправить пользователя в другой домен с некоторыми переданными параметрами (xyz.com/p1=v2) в зависимости от значения, скажем, param1. Этот шаг должен быть максимально быстрым

  2. Мне нужно сохранить детали ссылки на мою БД после некоторой обработки.

Я планирую сделать это с помощью комбинации 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...)

надеюсь, это поможет:)

Другие вопросы по тегам