场景:nginx接收client发送的一个请求,会将其解析并生成多个新请求,并将每个新请求分别发送给多个上游server。解析及发送新请求均用lua实现
目前用lua-ngxin-module的API connect()向上游server建连时,如果有多台server建连超时,则所有超时时间会累加并反映到前端响应中,代码如下:
for i = 1, num do --num为上游server个数
local tcp = ngx.socket.tcp()
tcp:settimeout(3000) --设置3秒超时
res, err = tcp:connect(servers[i], 80) --server[i]为每个上游server
end
如果有2台上游server建连超时,那返回给前端client的响应将延迟 3 * 2 = 6秒。之前看到网上对API connect()的说明,是非阻塞工作的,但从这里的现象感觉是阻塞的。当有多台上游server建连超时,对前端原始请求会造成很大影响。
而C代码里的非阻塞方式:调用connect(),设置o_noblock并把socket插入epoll监听队列,是不会出现超时累加的情况的。
另外lua-ngxin-module的API connect()的第3参数options_table用法不明,不知能否改善这个超时累加问题?
在lua-ngxin-module中没有类似epoll/select的API,请教各位大神,如何实现非阻塞建连?
个人lua-ngxin-module版本为v0.9.4。
最开始使用lua-resty-http的API connect()也有同样的问题。