场景: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]为每个上游serverend
如果有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()也有同样的问题。
--
--
邮件来自列表“openresty”,专用于技术讨论!
订阅: 请发空白邮件到 openresty...@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+...@googlegroups.com
归档: http://groups.google.com/group/openresty
官网: http://openresty.org/
仓库: https://github.com/agentzh/ngx_openresty
教程: http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html
是不是需要用个类似epoll或者select的lua_nginx_module的API,和connect配套使用?就像C那样
多谢doujiang大大指点!!!我后来确实使用了 ngx.thread.spawn来并行发送新建请求,在请求数量较少的情况下,确实收到了预期的效果,即多个请求的超时不会累加。但是当请求数量很大时,比如500,只能发出前20个左右的请求,后面的全丢失了,从前端原始请求的响应以及抓包,都证实了。是不是本身lua light thread数量有限?不知是否能调整数量上限?
代码如下:local ths_url = {}for i = 1, urls_num do --urls_num对应请求的个数ths_url[i] = ngx.thread.spawn(send_data, url[i], srvs, srvs_num) --send_data是发送请求的函数end
for i = 1, urls_num dongx.thread.wait(ths_url[i])end
--