已经完成,主要原理是使用 lua-resty-http 发起了一个 etcd 的 watch 请求,相当于:`curl http://etcd/v2/keys/service/dir/somekeys?wait=true&waitIndex=1234`
目前是设置了 2min 超时时间,如果超时或者获得返回重新启动 ngx.timer.at 循环
问题是:
如果不设置超时,那么这个请求一直阻塞,会导致 worker process 不能退出。
如果设置超时,那么 worker 还是最多需要 1 个超时时间才能退出。并且 error log 里会打印 `lua tcp read time out`,应该是底层的 socket 代码打印的。
所以有没有办法使用 thread 或者 coroutine 方式实现 watch,在外层循环检查 ngx.worker.exiting 终止这个 thread ?以下代码是否合适?
function watch(...)
while true do
local resp = http:request(...)
update_share_dict(resp)
dump_to_file()
end
end
local th = ngx.thread.spwan(watch,....)
while true do
if ngx.worker.exiting() then
ngx.thread.kill(th)
end
end
On Sunday, March 13, 2016 at 12:54:50 AM UTC+8, rr Feng wrote:
基本结构:
_M.data 存储 upstream 的信息
_M.init() 传进 etcd 的配置来,用 timer 启动循环来 watch etcd 的改动,实时更新 _M.data
_M.get_peer() 获得一个 backend server
在 init_worker_by_lua 里来 init,然后通过 balancer_by_lua 调用 _M.get_peer 和 balancer.set_current_peer 来完成后端服务器的选择。
然后问题是:
worker 启动时,upstream 是空的,即 _M.data="" reload config 都会导致一段时间内服务不可访问。
怎么解决这个问题……
想来想去没有想到好办法。