此值定时上报其他服务器来支持负载均衡。大致代码是这个样子(content_by_lua内容):
local stat = ngx.shared.stat
stat:incr("CONN_NUM", 1) --- 业务连接数加1
.........
while write_len < need_len do
local data = "">time_read_len)
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跟了一下,客户端断连接的话,最终会写超时,然后会调用ngx_http_lua_flush_cleanup等清理函数,此协程内的资源会释放,但是ngx.flush后面的涉及到共享内存操作等的逻辑是执行不了的,ngx.flush如果作为脚本的最后一行,肯定是没问题的,脚本后面有其他逻辑的话,就不保险了。从lua这一层面来看,不够友好。
因为时间比较赶,所以现在我的解决办法是自己在ngx_http_lua_flush_cleanup函数里面临时加了一小段代码,相当于注册了一个写死名字的收尾lua函数。
出现这个情况不知道是我自己的用法不对,还是确实存在此问题,望大家指点。
之前有发过这封邮件,但怀疑没发送成功,今天再发一次,如有叨扰,十分抱歉。
谢谢!