ngx.eof() 之后的代码执行有时间或者其它什么限制吗?如果之后有一个死循环,会一直执行吗?
我试了下面的代码,在我的机器上(Mac Mountain Lion, ngx_openresty/
1.2.1.14) i 到60左右循环就停掉了,不再打印error log;如果把 这一行注释掉,i 就可以远远超过60(观察i到过220多)。
所以很想知道是什么因素决定了ngx.eof()之后代码执行的数量或时间。
# nginx.conf
keepalive_timeout 0;
server {
location /test_eof {
content_by_lua '
local a = string.rep("x", 1000000)
ngx.say(a)
ngx.say("end!")
ngx.eof()
local i = 1
while true do
ngx.log(ngx.ERR, "i:", tostring(i))
i = i + 1
ngx.sleep(1)
end
';
}
}
On Saturday, July 28, 2012, agentzh wrote:
Hello!
2012/7/27 ganggewudi <3925...@qq.com>:
> ngx.eof()是返回http请求了,但是接下来的数据库查询还会继续执行吗?
当然。
> 线程不销毁吗?
nginx 是单线程的程序,不存在线程销毁的概念。如果你说的是 nginx 内部的请求处理生命期,是的,生命期会延后到你所有的 Lua
代码执行完毕,即使客户端提前断开了连接(当然,未来支持了 lua_ignore_client_abort off 就不一定了)。
> memc,resdis有现成的模块自动在后台监听吗?峰值有时候来了大量的url,就想一秒内先把数据全接下来,然后就返回,而不是等三四秒,之后再执行数据库插入动作,我很迷惑的就是谁来执行这个插入动作,我想的解决办法是pub到channel上,写脚本监听,或者是直接插到rabbitmq这样的软件中,就返回,插入数据库动作就又第三方完成。但是这都不是最好的解决办法,要是在lua直接就完成了,就好了。
你说的这些和我上面说的不是一回事。我说的意思是:
# nginx.conf
keepalive_timeout 0;
server {
location /api {
content_by_lua '
local query = generate_query_from_request()
output_response()
ngx.eof()
do_db_query(query)
';
}
}
印度的一家流量很大的在线统计应用已经在生产上使用了这种方式。
当然,如果能换成通过外部队列和独立的后台工作进程来实现任务调度和离线计算自然最好了,这样有助于提高 nginx 进程的稳定性,同时也有助于实现任务队列的分布式。
Best regards,
-agentzh