Параллельные запросы Openresty

Я хотел бы использовать OpenResty с интерпретатором Lua.

Я не могу настроить платформу OpenResty для обработки двух одновременных запросов к двум отдельным конечным точкам. Я имитирую, что один запрос выполняет некоторые сложные вычисления, работая в длинном цикле:

local function busyWaiting()
    local self = coroutine.running()
    local i = 1
    while i < 9999999 do
        i = i + 1
        coroutine.yield(self)
    end
end

local self = coroutine.running()
local thread = ngx.thread.spawn(busyWaiting)

while (coroutine.status(thread) ~= 'zombie') do
    coroutine.yield(self)
end


ngx.say('test1!')

Другая конечная точка просто немедленно отправляет ответ. ngx.say('test2')

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

Установка параметра nginx worker_processes 1; на большее число также не помогает, и я все равно хотел бы иметь только один рабочий процесс.

Как правильно разрешить OpenResty обрабатывать дополнительные запросы и не блокировать первый запрос?


person JeFf    schedule 20.02.2017    source источник
comment
Вы не предоставляете никакого кода, показывающего нам, как вы отправляете подзапросы. Я предполагаю, что вы используете что-то вроде ngx.location.capture для отправки подзапросов на конечные точки. Вы должны использовать github.com/openresty/lua-nginx-module#ngxlocationcapture_multi. API для параллельных подзапросов.   -  person Alexander Altshuler    schedule 21.02.2017
comment
Я не использую ngx.location.capture. Я использую два отдельных клиента для подключения к двум разным конечным точкам на одном сервере.   -  person JeFf    schedule 21.02.2017
comment
@JeFi извините, не понял ваш вариант использования, теперь понятно, смотрите мой ответ ниже   -  person Alexander Altshuler    schedule 22.02.2017
comment
Вы когда-нибудь решали это?   -  person MappaM    schedule 16.09.2019
comment
@MappaM, к сожалению, нет.   -  person JeFf    schedule 20.09.2019


Ответы (1)


person    schedule
comment
Изменение coroutine.yield на coroutine.resume во втором цикле while не приводит к тому, что интерпретатор продолжает работу с сопрограммой, увеличивающей переменную i. Переменная i увеличивается только до значения 2. Затем второй цикл while становится бесконечным. - person JeFf; 22.02.2017
comment
Извините, вы работаете в контексте Openresty, добавьте ngx. префикс ко всем API - person Alexander Altshuler; 23.02.2017
comment
ngx.coroutine не существует, и этот ответ не решает проблему... - person MappaM; 16.09.2019
comment
@MappaM, ты забавный, github.com/openresty/ - person Alexander Altshuler; 27.09.2019
comment
Вы должны объяснить в своем ответе, что вы изменили и почему, по вашему мнению, это должно работать. Возможно, это потому, что я пытался использовать стандартную версию NGINX+Lua, а не версию Openresty. В котором сопрограмма является основным именем пакета. ngx.coroutine не существует и выдает ошибку. И использование coroutine.yield не решает поставленной проблемы, сервер не будет обслуживать другой запрос даже при уступке. - person MappaM; 29.09.2019
comment
@MappaM вопрос об OpenResty - person Alexander Altshuler; 30.09.2019