想做一个下载流服务器,不停地从后端读文件数据,然后写到http客户端,同时维护了一个共享内存中的业务总连接数值,此值定时上报其他服务器来支持负载均衡。
大致代码是这个样子(content_by_lua内容):
local stat = ngx.shared.stat
stat:incr("CONN_NUM", 1) --- 业务连接数加1
.........
while write_len < need_len do
local data = "">
if data then
ngx.print(data)
ngx.flush(true)
write_len = write_len + this_time_read_len
else
......................
end
............
stat:incr("CONN_NUM", -1) ----业务连接数减1
简单注解:write_len为已发送至客户端的数据长度,need_len是客户端需要的总长度。my_read_from_backend是从后端读数据的函数。
发现的问题:当运行至ngx.flush且在lua代码中其还未返回时,如果客户端把连接断掉了,那么,它后面的逻辑就永远都走不过去了,这里是连接数减1这个逻辑,当然其他也是一样,比如一些全局资源的释放
gdb跟了一下,客户端断连接的话,flush发送这里最终会写超时,然后会调用ngx_http_lua_flush_cleanup等清理函数,此协程内的资源会释放,但是ngx.flush后面的涉及到共享内存操作等的逻辑是执行不了的,感觉ngx.flush如果作为脚本的最后一行,肯定是没问题的,后面有其他逻辑的话,就不保险了
不知道是我自己的用法有问题,还是确实存在此问题,望大神们指点
谢谢!