Dear agentzh,
感谢lua-resty-upstream-healthcheck这样一个轻量级健康检查模块:)
在使用中,我的upstream有四个server,nginx有8个worker_processes
调用如下:
init_worker_by_lua '
local hc = require "resty.upstream.healthcheck";
local ok, err = hc.spawn_checker {
shm = "health_28536",
upstream = "ONLINE_SERVERS",
type = "http",
http_req = "GET /activate HTTP/1.1\\r\\nHost: xxx\\r\\n\\r\\n",
interval = 5000,
timeout = 1000,
fall = 3,
rise = 2,
valid_statuses = {200},
concurrency = 4,
}
if not ok then
ngx.log(ngx.ERR, "SPAWN_CHECKER failed: err=", err);
return
end
';
在log中,开始每五秒,每个upstream只收到1个请求
但慢慢变多,最后,每五秒的cycle内,每个worker都发送了一个 http_req,
4个server一共收到了32个请求
调整concurrency=1,结局同上。
debug结果显示在这个时候8个worker的get_lock均成功获得锁,从而重复执行了检查
我猜测是因为先调用do_check,再调用new_timer,各个worker间并不能保证同步导致的
如果想严格按照interval来进行检查,可否将get_lock中dict:add的过期时间直接设为ctx.interval,
并且不执行release_lock?因为set_peer_down_globally已经可以保证up/down信息在所有worker间共享了,不需要每个worker都执行一次同样的检查。(虽然开销很小,只是看着不爽而已:))
非常感谢。