作者回复: 要看调用次数的,热代码才有 JIT 的必要性。loadstring 并不是一个频繁的操作,不会有性能问题的
作者回复: 可以写在 ngx.timer 里面,到数据库中定期的去检测版本号或者修改时间是否有变化。
作者回复: 算的,这是 Nginx/OpenResty 自身的升级。但这个过程会关闭旧的 workers,启动新的 workers,可能耗时比较久,而且会丢失缓存。这种二级制热升级应该保持一个很低频的操作。
作者回复: 给你一个更具体的示例:
resty -e 'local s = [[
local ngx = ngx
local _M = {}
function _M.f()
ngx.say("hello world")
end
return _M
]]
local lua = loadstring(s)
local ret, func = pcall(lua)
func.f()'
这里的 `s` 就是一个完整的 Lua 模块,在发现变化的时候,你可以用 loadstring 或者 loadfile 重启加载。你也把可以把获取变化和重新加载用 code_loader 函数做一层包装:
```
local func = code_loader(name)
```
而在 code_loader 中我们一般会用 lru cache 对 `s` 做一层缓存。
这差不多就是完整的实现了。
作者回复: 多谢指正,确实这里弄错了。lua-resty-upstream-healthcheck带的是 ngx.timer.at 这种主动健康检查的方式,而没有被动健康检查。
作者回复: 你可以使用 checker:add_target 来设置多个上游节点的 ip 和端口,就像这个测试案例一样:https://github.com/Kong/lua-resty-healthcheck/blob/master/t/06-report_http_status.t#L69
作者回复: balancer_by_lua 可以让用户选择负载均衡的算法是roundrobin 还是 chash,或者是其他的算法,比较自由。另外,在你的实现中,上游健康检查也需要自己来实现,有不少额外的工作量。