2017-02-20 1 views
0

OpenResty를 루아 인터프리터와 함께 사용하고 싶습니다.Openresty 동시 요청

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가 추가 요청을 처리하고 첫 번째 요청에 의해 차단되지 않도록하는 적절한 방법은 무엇입니까?

+0

하위 요청을 보내는 방법을 보여주는 코드는 제공하지 않습니다. 하위 쿼리를 끝점으로 보내려면 ngx.location.capture와 같은 것을 사용한다고 가정합니다. 병렬로 실행되는 하위 요청에는 https://github.com/openresty/lua-nginx-module#ngxlocationcapture_multi API를 사용해야합니다. –

+0

ngx.location.capture를 사용하고 있지 않습니다. 두 개의 개별 클라이언트를 사용하여 동일한 서버에서 두 개의 다른 엔드 포인트에 연결합니다. – JeFf

+0

@JeFi 유감스러운, 유스 케이스를 이해하지 못했습니다, 지금은 분명 내 대답을 참조하십시오 –

답변

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

local thread = ngx.thread.spawn(busyWaiting) 

while (ngx.coroutine.status(thread) ~= 'dead') do 
    ngx.coroutine.resume(thread) 
end 


ngx.say('test1!') 
+0

'coroutine.yield'를'coroutine.resume'으로 바꾸는 동안 while 루프는 인터프리터가 coroutine 증가 변수 '나'. 변수'i'는 값 2로만 증가합니다. 두 번째 while 루프는 무한이됩니다. – JeFf

+0

죄송합니다. Openresty 컨텍스트에서 작업 중이며 "ngx"를 추가하십시오. 모든 API 접두사 –